【问题标题】:Multiple SqlCommand parameters with same name多个具有相同名称的 SqlCommand 参数
【发布时间】:2016-02-04 07:39:44
【问题描述】:

我有一个查询,其中包含多个具有相同名称的命名参数,我必须为其传递值。考虑以下示例(在非存储过程后面的代码中查询):

Dim stSqlQry As String = "Select fld1, fld2, fld3 From tbl1 Where fld3=@fld3
    AND fld1 NOT IN(Select Distinct fld1 From tbl2 Where fld3=@fld3)
    AND fld2 NOT IN(Select Distinct fld2 From tbl3 Where fld3=@fld3)"

我使用以下 sn-p 将值传递给 fld3:

cmd = New SqlCommand(stSqlQry)
cmd.Parameters.AddWithValue("@fld3", fld3_val)

运行时它会为@fld3 提供标量变量错误(并且在调试中 fld3_val 有一个值)。因此,作为一种解决方法,我使用它如下声明三个命名参数fld3_1, fld3_2, fld3_3

Dim stSqlQry As String = "Select fld1, fld2, fld3 From tbl1 Where fld3=@fld3_1
    AND fld1 NOT IN(Select Distinct fld1 From tbl2 Where fld3=@fld3_2)
    AND fld2 NOT IN(Select Distinct fld2 From tbl3 Where fld3=@fld3_3)"

并使用以下 sn-p 将相同的值传递给 fld3_1, fld3_2, fld3_3

cmd = New SqlCommand(stSqlQry)
cmd.Parameters.AddWithValue("@fld3_1", fld3_val)
cmd.Parameters.AddWithValue("@fld3_2", fld3_val)
cmd.Parameters.AddWithValue("@fld3_3", fld3_val)

第二个完美,第一个格式在后面的代码中不正确吗?有没有什么方法可以使用单个SqlCommand Parameter 将值传递给多个 SQL 参数?

【问题讨论】:

  • 不确定为什么第一个失败并显示该错误消息。您能否尝试更改删除 AddWithValue 的第一个调用并使用 Add(param, type).Value = value 语法?
  • 好的,我也会试试那个格式,然后告诉你结果。
  • 我猜您正在使用内联 sql 而不是存储过程。使用存储过程多次使用相同的参数是没有问题的,但是使用内联 sql 每个@ 符号基本上就像声明一个新变量一样,因此会出现错误。使用您拥有的解决方法或编写存储过程。我建议使用存储过程。
  • @ZoharPeled 所有代码都在代码后面,没有存储过程。我还没有尝试过史蒂夫的建议。更新了我的问题以避免混淆。
  • @haraman 在这种情况下我认为史蒂夫的建议不会有帮助。 AddWithValud 被认为是不好的做法,因为它强制 ado.net 从值推断参数类型,这可能会导致一些问题,但这不是其中之一。我确实建议更改为存储过程。

标签: c# asp.net sql-server vb.net parameters


【解决方案1】:

对我有用并且可能对你有用的一件事是挑选出字段名称。

Dim stSqlQry As String = "Select [fld1], [fld2], [fld3] From [tbl1] Where [fld3] = @fld3 AND [fld1] NOT IN(Select Distinct [fld1] From [tbl2] Where [fld3] = @fld3) AND [fld2] NOT IN(Select Distinct [fld2] From [tbl3] Where [fld3] = @fld3)"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-14
    • 2014-05-13
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多