0

我正在尝试找到一种正确的方法来执行此操作,而不是简单的字符串连接。

我有一个(简化的)SQL 语句,如下所示:

SELECT * FROM Zones WHERE id in (@zoneIDs);

我打算插入@zoneIDs这样的值:100000,100001,100002

我在这个特定的实例中使用 VB,但它应该适用于使用 MySQL 连接器的任何 .Net 语言。我正在尝试的是:

Private GetZones As String = "SELECT * FROM Zones WHERE id in (@zoneIDs)"
Dim Param As MySqlParameter = New MySqlParameter("@zoneIDs", MySqlDbType.String)
Param.Value = "100000,100001,100002"
Dim adapter As MySqlDataAdapter = New MySqlDataAdapter(GetZones)
Dim dt as DataTable = New DataTable()
adapter.Fill(dt)

但是要填写的dt只是 ID 100000 的行,就好像查询中没有其他人一样。我的猜测是它正在运行这样的命令:

SELECT * FROM Zones WHERE id in ("100000,100001,100002");

代替

SELECT * FROM Zones WHERE id in (100000,100001,100002);

我个人更喜欢使用存储过程而不是像这样的字符串,但我相信我会在那里碰壁。使用这样的参数填充 IN 子句的正确方法是什么?

4

1 回答 1

0

为了进一步解释我的评论,您可以使用类似于您已有的 SQL 查询的函数:

Private Function GetZones(ByVal zoneID As String) As DataRow
    Dim connStr As String = "blah" 'Try getting this from app.config'
    Dim conn As New MySqlConnection(connStr)
    Dim cmd As New MySqlCommand()
    Dim dt As DataTable = Nothing
    Dim sSQL As String = "SELECT * FROM Zones WHERE id in (@zoneID)"
    Dim da As New MySqlDataAdapter(sSQL, conn)

    With cmd
        .CommandType = CommandType.Text
        .CommandText = sSQL
        .Connection = conn
        .Parameters.AddWithValue("@zoneID", zoneID)
    End With
    Try
        conn.Open()
        da.Fill(dt)
    Catch ex As Exception
      'Blah'
    Finally
       conn.Close()
    End Try
    Return dt.Rows(0)
End Function

然后,在您的代码中,您可以执行以下操作:

Public Function GetZonesTable(ByVal zoneIDs() As String) As DataTable
    Dim zonesDT As DataTable = Nothing

    For Each zoneID As String In zoneIDs
        zonesDT.Rows.Add(GetZones(zoneID))
    Next

    Return zonesDT
End Function

您正在做的是构建您的 zoneID 数组并将该数组传递给 GetZonesTable 函数,然后该函数在内存中创建一个 DataTable,调用 GetZones() 函数并将数组中的每个 zoneID 传递给它。对于 zoneIDs 数组中的每个 zoneID,它会将返回的行添加到 zoneDT 并且 GetZonesTable 返回您的最终表格。虽然这对服务器来说并不太苛刻,但它可能会变得相当密集,具体取决于查询本身和存储在数组中的 zoneID 数量。

根据您的 SQL 版本,有一些 SQL 技巧可能不太密集,但它们比我上面的解释要深入得多。如果需要,请告诉我您使用的是什么版本的 SQL。

于 2012-09-19T18:19:55.787 回答