在C#using Connector/Net中,MySql命名参数应该使用哪个前缀?
我正在为一个C#项目使用它,并且已经使用它(或以前的版本)很长时间了 当我浏览遗留代码时,我看到了一些与参数化查询相关的变体,并一直在尝试确定它们之间的差异以及是否有最佳实践 查询字符串:在C#using Connector/Net中,MySql命名参数应该使用哪个前缀?,mysql,.net,parameterized-query,Mysql,.net,Parameterized Query,我正在为一个C#项目使用它,并且已经使用它(或以前的版本)很长时间了 当我浏览遗留代码时,我看到了一些与参数化查询相关的变体,并一直在尝试确定它们之间的差异以及是否有最佳实践 查询字符串: 示例1:cmd.CommandText=“更新表集内容=@value;” 示例2:cmd.CommandText=“更新表集内容=?值;” 添加参数: 例3:cmd.Parameters.AddWithValue(“@value”,user\u value) 示例4:cmd.Parameters.Add
- 示例1:
cmd.CommandText=“更新表集内容=@value;”代码>
- 示例2:
cmd.CommandText=“更新表集内容=?值;”代码>
- 例3:
cmd.Parameters.AddWithValue(“@value”,user\u value)代码>
- 示例4:
cmd.Parameters.AddWithValue(“?value”,用户值)代码>
- 示例5:
cmd.Parameters.AddWithValue(“值”,用户值)代码>
@
vs?
)。然而,它提出了以下建议:
- 未命名参数可以指定为“?”符号
- 命名参数的声明使用前缀“:”或“@”后跟参数名称。请注意,如果CommandText中的参数与“@”前缀一起使用,则命令集合中MySqlParameter对象的名称应包含“@”前缀。如果CommandText中的参数包含“:”前缀,则应使用命令集合中MySqlParameter对象的名称,而不使用任何前缀
@
”语句时,cmd.Parameters.AddWithValue(“@value”,user\u value))
也应该包含“@
”,但在使用“:
”时不能包含
但是,在我正在回顾的许多函数方法中,查询在命令文本中使用“@
”(示例1),而在AddWithValue()
语句中使用“而不是”(示例5)
问题:
- 添加参数时省略前缀的潜在后果是什么?(例5)
- 使用“
”前缀时,是否没有理由添加参数名称,因为它用于未命名的参数?(例2)?
- 您的问题的答案:
示例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);
此处,应分配给“thing2”的“user_value2”被分配给“thing1”,因为它出现在索引中的第一位
因此,如果我使用严格命名的参数,使用
@
(我更喜欢),是否有任何理由在AddWithValue
的参数中也使用@
?这两种方法似乎都可行。不一定,但最好让你的代码经得起未来的考验,以防开发人员决定代码应该更严格。我希望看到此更新显示显式类型,而不是AddWithValue