Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie dynamiczne wykorzystujące zmienną liczbę argumentów IN (p1, p2, p3)

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobierz ostatnio wstawiony identyfikator automatycznego przyrostu w mysql

  2. Przewijalny/aktualizowany zestaw wyników MySQL nie działa zgodnie z oczekiwaniami

  3. Jak napisać regex lookahead/lookbehind w mysql

  4. Zapytanie SUMA dla dwóch pól w dwóch różnych tabelach

  5. Jak działa samodołączanie MYSQL?