我应该在C#中使用Connector/Net为MySql命名参数使用哪个前缀?

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页面显示以下内容:

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

最后一点有一些语法问题,但所示的例子似乎表明,当使用' @'时,语句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',因为它首先出现在索引中.

在此输入图像描述