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 に答える