От коментари:
depToDelete и otherToDelete са списък (на низ), който преминава от извикване на функция. Те съдържат 1 или много водачи, които искам да изтрия
За това вашият код не го форматира правилно за SQL. За списък с 2 Guid низа след присъединяването получавате това:
"af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"
След това strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77)
явно иска да се опита да премахне цитата и да го замени с отметка. Проблемът е, че самият низ не включва цитат. Виждате го в IDE, защото това е начинът на VS да ви каже, че е низ.
SubString
стъпката е изрязване на валидни Guid знаци от резултата (и магически номер от 77
позволява да се срине, когато няма само точния брой от тях):
Преди:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&След:"b842f14-7932-4e3d-8483-07790ccc674c,...
Това няма да работи, защото съдържанието не е едно много дълго ръководство. Всеки елемент в List
трябва да се отметне. За да отметнете всеки елемент в списъка, трябва да завъртите и изградите низ или да използвате linq.
Но и това няма да работи. MySQL просто не харесва резултантния низ от NET доставчика по този начин и не прави масиви от параметри, така че...
И така, нека да изградим машина за параметри:
Няма смисъл да работите с 2 комплекта Guids, така че ги свържете (това са действителен List(of String)
съдържащи guids, а не нещо друго, не 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
Изходът за отстраняване на грешки е синтактично правилен:
...и 3-те реда с тези GUID се изтриват!
Също така:
- Празните блокове Catch са лоши, защото крият проблеми от единствения човек, който може да ги поправи (вие).
- Трябва да използвате Option Strict, за да избегнете VB да гадае какво имате предвид под определени неща.