在使用Connector/Net连接MySql数据库时,我应该使用哪个前缀来命名参数?

5

我正在使用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 ?)。然而,这个devart.com页面提供了以下建议:

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

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

然而,在我正在审查的许多功能方法中,查询在命令文本中使用“@”(例如1),但在AddWithValue()语句中没有使用“@”(例如5)。

问题:

  • 省略添加参数时的前缀可能会产生什么潜在后果? (示例5)

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

1个回答

8

你的问题的答案:

示例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”。

如果我使用严格命名的参数,使用 @(我更喜欢这种方式),那么在 AddWithValue 的参数中也使用 @ 是否有任何理由呢?似乎两种方式都可以工作。 - JYelton
不一定,但最好让你的代码具有未来性,以防开发人员决定代码应该更加严格。 - Gaurav Joseph
1
我希望看到这个更新,以显示显式类型而不是AddWithValue。 - Joel Coehoorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接