sql >> データベース >  >> RDS >> Mysql

可変数のIN(p1、p2、p3)引数を使用した動的クエリ

    コメントから:

    depToDeleteおよびotherToDeleteは、関数呼び出しから渡される(文字列の)リストです。これらには、削除したい1つ以上のGUIDが含まれています

    そのため、コードはSQL用に正しくフォーマットしていません。 2つのGUID文字列のリストについては、結合後に次のようになります。

    "af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"
    

    次に、strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77) どうやら引用符を削除してダニに置き換えようとしているようです。問題は、文字列自体に引用符が含まれていないことです。 VSが文字列であることを示す方法であるため、IDEに表示されます。

    SubString ステップは、結果(および77のマジックナンバー)から有効なGUID文字をトリミングしています。 適切な数だけではない場合にクラッシュする可能性があります):

    前:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
    &変更後:"b842f14-7932-4e3d-8483-07790ccc674c,...

    内容が1つの非常に長いGUIDではないため、これは機能しません。各要素 List内 チェックする必要があります。リスト内の各要素にチェックマークを付けるには、ループして文字列を作成するか、linqを使用する必要があります。

    しかし、それも機能しません。 MySQLは、NETプロバイダーからの結果の文字列をそのように好まないため、パラメーター配列を実行しません...

    では、パラメータエンジンを構築しましょう:

    2セットのGUIDを操作する意味がないため、それらを連結します(これらは実際のList(of String) GUIDを含み、他のものではなく、jsonではありません):

    Dim depVals = depToDelete.Concat(otherToDelete).ToList
    
    ' your sql here
    Dim sql = "DELETE FROM DEMO WHERE GuidString IN (@magic)"
    ' param storage
    Dim gvalues As New List(Of String)
    
    ' create a list of "@g" param placeholders
    Dim ndx As Int32 = 0
    For ndx = 0 To depVals.Count - 1
        ' adds a "@gN" value to the List
        gvalues.Add(String.Format("@g{0}", (ndx + 1).ToString))
    Next
    
    ' insert them into the SQL string
    sql = sql.Replace("@magic", String.Join(", ", gvalues))
    ' '@magic' replaced with "@g1, @g2, @g3..." 
    
    Using cmd As New MySqlCommand(sql, dbcon)
        dbcon.Open()
    
        ' create an equal number of Paramerters, set the value of each
        For n As Int32 = 0 To gvalues.Count - 1
           ' add parm "@gN", assign value from 'depVals`
           cmd.Parameters.Add(gvalues(n), MySqlDbType.String).Value = depVals(n)
        Next
    
       ' debug:
       Dim fullSQL = GetFullCommandSQL(cmd)
       Console.WriteLine(fullSQL)
    
       Dim rows = cmd.ExecuteNonQuery()
    End Using
    

    デバッグ出力は構文的に正しいです:

    ...そしてそれらのGUIDを持つ3つの行が削除されます!

    また:

    • 空のキャッチブロックは、問題を修正できる唯一の人(あなた)から問題を隠すため、悪いものです。
    • VBが特定のことの意味を推測しないように、OptionStrictを使用する必要があります。



    1. Hibernate + c3p0 + MySqlが多数のスリープ接続を作成するのを防ぐにはどうすればよいですか?

    2. MariaDBSkySQLを使用してクラウドでより高く上昇

    3. Pythonを使用してPostgreSQLクエリをcsvファイルにエクスポートする

    4. PythonでのMySQLLOADDATA LOCAL INFILEの例?