我正在使用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建议如下:
最后一点有一些语法问题,但显示的示例似乎表明在使用“@
”时,语句cmd.Parameters.AddWithValue("@value", user_value);
也应该包含“@
”,但不是使用“:
”时。
但是,在我正在审核的许多正常运行的方法中,查询在命令文本(示例1)中使用了“@
”,但是 没有AddWithValue()
语句(示例5)中的 。
添加参数时省略前缀的潜在后果是什么? (示例5)
使用“?
”前缀时是否没有理由添加参数名称,因为它用于未命名的参数? (示例2)
答案 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'因为它首先出现在索引中。