Z komentarzy:
depToDelete i otherToDelete są listą (łańcuchów) przekazywanych z wywołania funkcji. Zawierają 1 lub wiele przewodników, które chcę usunąć
W tym celu Twój kod nie formatuje go poprawnie dla SQL. Aby uzyskać listę 2 ciągów Guid, po dołączeniu otrzymasz:
"af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"
Następnie strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77)
najwyraźniej chce spróbować usunąć cytat i zastąpić go haczykiem. Problem polega na tym, że sam ciąg nie zawiera cytatu. Widzisz to w IDE, ponieważ w ten sposób VS informuje Cię, że jest to ciąg znaków.
SubString
krok usuwa prawidłowe znaki Guid z wyniku (i magiczną liczbę 77
pozwala na awarię, gdy nie ma ich odpowiedniej liczby):
Przed:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&Po:"b842f14-7932-4e3d-8483-07790ccc674c,...
To nie zadziała, ponieważ zawartość nie jest jednym bardzo długim przewodnikiem. Każdy element na List
musi być zaznaczone. Aby zaznaczyć każdy element na liście, musisz zapętlić i zbudować ciąg lub użyć linq.
Ale to też nie zadziała. MySQL po prostu nie lubi wynikowego ciągu od dostawcy NET w ten sposób i nie robi tablic parametrów, więc...
Więc zbudujmy silnik parametrów:
Praca z 2 zestawami Guidów nie ma sensu, więc połącz je (są to rzeczywiste List(of String)
zawierające przewodniki, a nie coś innego, nie 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
Dane wyjściowe debugowania są poprawne składniowo:
...a 3 wiersze z tymi identyfikatorami GUID zostaną usunięte!
Również:
- Puste bloki Catch są złe, ponieważ ukrywają problemy przed jedyną osobą, która może je naprawić (ty).
- Powinieneś użyć Option Strict, aby uniknąć zgadywania przez VB, co masz na myśli przez pewne rzeczy.