【问题标题】:VB .NET Paramaterized SQL call not correctly parsing IN clause arguments [duplicate]VB .NET 参数化 SQL 调用未正确解析 IN 子句参数 [重复]
【发布时间】:2016-09-30 17:12:22
【问题描述】:

所以我目前正在从事一个项目,我希望从与屏幕上可修改列表匹配的表中检索所有数据。这是我用来拨打电话的代码示例

Public Sub GetAnimals(ByReg selectedTypes As String)
    Dim strSql As String
    Dim pselectedTypes As SqlClient.SqlParameter = New SqlClient.SqlParameter("@pselectedTypes", selectedTypes)
    Dim strDBConnection As String = DBConnection.GetConnection.ConnectionString
    Dim rs As DataSet = new DataSet

    strSql = "SELECT * FROM PetInformation WHERE AnimalType IN (@pselectedTypes)"

    Using sqlConn As SqlClient.SqlConnection = New SqlClient.SqlConnection(strDBConnection)
        sqlConn.Open()
        Using sqlcmd As SqlClient.SqlCommand = New SqlClient.SqlCommand
            With sqlcmd
                .Connection = sqlConn
                .CommandTimeout = DBConnection.DLLTimeout
                .CommandType = CommandType.Text
                .CommandText = strSql
                .Parameters.Add(pselectedTypes)
                Using sqlda As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(sqlcmd)
                    sqlda.Fill(rs)
                End Using
            End with
        End Using
    End Using

    ' Data Calculations
End Sub

这会使 SQL 查询看起来像这样。在本例中,我将我的动物列表用作猫和狗。

exec sp_executesql N'SELECT * FROM PetInformation WHERE AnimalType IN (@pselectedTypes)',N'@pselectedTypes nvarchar(22),@pselectedTypes='''cat'',''dog''' 

所以一切看起来都很好,但是当我去运行它并执行它时,我没有得到任何结果。如果我将 sql 更改为看起来像其中任何一个,我会取回数据,但是由于生成了这个 SQL,所以如果没有从参数化 sql 切换,这并不是一个真正的选项,我不想这样做。

exec sp_executesql N'SELECT * FROM PetInformation WHERE AnimalType IN (''cat'',''dog'')',N'@pselectedTypes nvarchar(22),@pselectedTypes='''cat'',''dog''' 

SELECT * FROM PetInformation WHERE AnimalType IN ('cat','dog')

有什么建议或想法吗?

【问题讨论】:

  • MySQL 和 SQL Server 是两种不同的生物
  • 我在 MySQL 和 SQL Server 上的不好,我匆忙添加了标签,没有检查它们。
  • 我有一种感觉 selectedTypes 是作为一个通用集合开始的?您可以将泛型集合作为表值参数传递给存储过程。使这种事情变得简单。 :D

标签: sql .net sql-server vb.net


【解决方案1】:

据我所知,没有数据库库允许像您尝试的那样对列表进行参数化。在这些情况下,您需要构建参数列表并根据列表中的元素数量动态查询。

【讨论】:

  • SQL Server 2008 及更高版本支持Table Valued Parameters,这将允许您将数组或列表作为pselectedTypes 参数传递。
  • 我知道 SQL Server 支持表值参数,我只是不知道支持已经降低到客户端 api 级别。很高兴知道。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
相关资源
最近更新 更多