Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#using Connector/Net中,MySql命名参数应该使用哪个前缀?_Mysql_.net_Parameterized Query - Fatal编程技术网

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

在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

我正在为一个C#项目使用它,并且已经使用它(或以前的版本)很长时间了

当我浏览遗留代码时,我看到了一些与参数化查询相关的变体,并一直在尝试确定它们之间的差异以及是否有最佳实践

查询字符串:
  • 示例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