JYe*_*ton 4 .net mysql 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 ?)的任何内容.但是,此devart.com页面显示以下内容:
最后一点有一些语法问题,但所示的例子似乎表明,当使用' @'时,语句cmd.Parameters.AddWithValue("@value", user_value);应包括' @',但不包括' :'.
但是,在我正在审查的许多正常运行的方法中,查询@在命令文本中使用了' ' (示例1),但在语句中没有使用' ' (示例5).AddWithValue()
添加参数时省略前缀的潜在后果是什么?(例5)
使用' ?'前缀时没有理由添加参数名称,因为它是用于未命名的参数吗?(例2)
小智 7
你的问题的答案:
示例5使用命名参数对象.使用这个是这样的:
cmd.CommandText = "UPDATE table SET thing = :value;";
cmd.Parameters.AddWithValue("value", user_value);
Run Code Online (Sandbox Code Playgroud)
你可以比较一下:
cmd.CommandText = "UPDATE table SET thing = @value;";
cmd.Parameters.AddWithValue("@value", user_value);
Run Code Online (Sandbox Code Playgroud)
请注意,使用冒号时不使用'@'.至少,它应该如何.它可能以另一种方式工作,因为在内部表示将是相同的.
未命名参数的使用略有不同.
cmd.CommandText = "UPDATE table SET thing = ?;";
cmd.Parameters.AddWithValue("anyname", user_value);
Run Code Online (Sandbox Code Playgroud)
参数的名称很可能是任何东西,它只是从索引值中获取.
虽然命名参数将按名称访问,但未命名的参数将由索引值使用,可能会分配错误的值,如下所示:
cmd.CommandText = "UPDATE table SET thing1 = ?, thing2 = ?;";
cmd.Parameters.AddWithValue("anyname1", user_value2);
cmd.Parameters.AddWithValue("anyname2", user_value1);
Run Code Online (Sandbox Code Playgroud)
这里应该分配给'thing2'的'user_value2'被赋值给'thing1',因为它首先出现在索引中.
