我正在使用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)
@
(我更喜欢这种方式),那么在AddWithValue
的参数中也使用@
是否有任何理由呢?似乎两种方式都可以工作。 - JYelton