Mysql
 sql >> база данни >  >> RDS >> Mysql

Динамична заявка, използваща променлив брой IN (p1, p2, p3) аргументи

От коментари:

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 да гадае какво имате предвид под определени неща.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Най-ефективният начин за получаване на броя на редовете в таблицата

  2. Mysql Left Join Null резултат

  3. Използване на автоматизация за ускоряване на тестовете за освобождаване на Galera Cluster с ClusterControl

  4. Принудително пускане на mysql, заобикаляйки ограничението на външния ключ

  5. Диаграма за актуализиране от падащ избор