Fra kommentarer:
depToDelete og otherToDelete er liste(over streng), som går fra et funktionskald. Disse indeholder 1 eller mange guider, som jeg ønsker at slette
Til det formaterer din kode den ikke korrekt til SQL. For en liste over 2 Guid Strings, efter joinforbindelsen får du denne:
"af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"
Derefter strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77)
ønsker tilsyneladende at forsøge at fjerne citatet og erstatte det med et flueben. Problemet er, at strengen i sig selv ikke indeholder et citat. Du ser det i IDE, fordi det er VS's måde at fortælle dig, at det er en streng.
SubString
Trin er trimning af gyldige vejledende tegn fra resultatet (og et magisk tal på 77
tillader det at gå ned, når der ikke kun er det rigtige antal af dem):
Før:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&Efter:"b842f14-7932-4e3d-8483-07790ccc674c,...
Dette virker ikke, fordi indholdet ikke er en meget lang guide. Hvert element i List
skal afkrydses. For at markere hvert element på listen skal du løkke og bygge en streng, eller bruge linq.
Men det virker heller ikke. MySQL kan bare ikke lide den resulterende streng fra NET-udbyderen på den måde, og den laver ikke parameterarrays, så...
Så lad os bygge en parametermotor:
Det giver ingen mening at arbejde med 2 sæt guider, så sammensæt dem (disse er en faktisk List(of String)
indeholdende guider, ikke noget andet, ikke 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
Debug-outputtet er syntaktisk korrekt:
...og de 3 rækker med disse GUID'er bliver slettet!
Også:
- Tomme fangstblokke er dårlige, fordi de skjuler problemer for den eneste person, der kan løse det (dig).
- Du bør bruge Option Strict for at undgå, at VB gætter, hvad du mener med visse ting.