我应该在C#中使用Connector / Net为MySql命名参数使用哪个前缀?

时间:2014-02-10 20:52:35

标签: mysql .net parameterized-query

我正在使用Connector/Net 6.8.3进行C#项目并且已经使用它(或之前的版本)已有一段时间了。

在查看遗留代码时,我看到了与参数化查询相关的几个变体,并且一直试图确定差异是什么以及是否有最佳实践。

查询字符串:

  • 示例1:cmd.CommandText = "UPDATE table SET thing = @value;";

  • 示例2:cmd.CommandText = "UPDATE table SET thing = ?value;";

添加参数:

  • 示例3:cmd.Parameters.AddWithValue("@value", user_value);

  • 示例4:cmd.Parameters.AddWithValue("?value", user_value);

  • 示例5:cmd.Parameters.AddWithValue("value", user_value);

所有这些变化似乎都有效。我无法在官方文档中找到解释前缀使用差异的任何内容(@ vs ?)。但是,this devart.com page建议如下:

  • 未命名的参数可以指定为“?”符号
  • 使用':'或'@'前缀声明命名参数,后跟参数名称。请注意,如果CommandText中的参数与“@”前缀一起使用,则命令集合中MySqlParameter对象的名称应包含“@”前缀。如果CommandText中的参数包含':'前缀,则应使用命令集合中的MySqlParameter对象的名称,不带任何前缀。

最后一点有一些语法问题,但显示的示例似乎表明在使用“@”时,语句cmd.Parameters.AddWithValue("@value", user_value);也应该包含“@”,但不是使用“:”时。

但是,在我正在审核的许多正常运行的方法中,查询在命令文本(示例1)中使用了“@”,但是 没有AddWithValue()语句(示例5)中的

问题:

  • 添加参数时省略前缀的潜在后果是什么? (示例5)

  • 使用“?”前缀时是否没有理由添加参数名称,因为它用于未命名的参数? (示例2)

1 个答案:

答案 0 :(得分:6)

你的问题的答案:

示例5使用命名参数对象。使用它是这样的:

cmd.CommandText = "UPDATE table SET thing = :value;";
cmd.Parameters.AddWithValue("value", user_value);

您可以与此进行比较:

cmd.CommandText = "UPDATE table SET thing = @value;";
cmd.Parameters.AddWithValue("@value", user_value);

请注意' @'使用冒号时不使用。至少,它应该如何。它可能以另一种方式工作,因为内部表示将是相同的。

使用未命名参数略有不同。

cmd.CommandText = "UPDATE table SET thing = ?;";
cmd.Parameters.AddWithValue("anyname", user_value);

参数的名称很可能是任何东西,它只是从索引值中获取。

虽然命名参数将按名称访问,但未命名的参数将被索引值使用,可能会分配错误的值,如下所示:

cmd.CommandText = "UPDATE table SET thing1 = ?, thing2 = ?;";
cmd.Parameters.AddWithValue("anyname1", user_value2);
cmd.Parameters.AddWithValue("anyname2", user_value1);

这里的' user_value2'应该分配到' thing2'被分配到' thing1'因为它首先出现在索引中。

enter image description here