コメントから:
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を使用する必要があります。