sql >> Databasteknik >  >> RDS >> Mysql

Dynamisk fråga med variabelt antal IN (p1, p2, p3) argument

Från kommentarer:

depToDelete och otherToDelete är list(med sträng) som skickas från ett funktionsanrop. Dessa innehåller 1 eller flera guider som jag vill ta bort

För det formaterar din kod den inte korrekt för SQL. För en lista med 2 Guid Strings, efter anslutningen får du detta:

"af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"

Sedan, strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77) vill tydligen försöka ta bort citatet och ersätta med en bock. Problemet är att själva strängen inte innehåller ett citat. Du ser det i IDE eftersom det är VS:s sätt att säga att det är en sträng.

SubString steget är att trimma giltiga guidetecken från resultatet (och ett magiskt tal på 77 gör att den kraschar när det inte finns bara rätt antal av dem):

Före:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&Efter:"b842f14-7932-4e3d-8483-07790ccc674c,...

Detta fungerar inte eftersom innehållet inte är en särskilt lång guide. Varje element i List måste markeras. För att markera varje element i listan måste du loopa och bygga en sträng, eller använda linq.

Men det fungerar inte heller. MySQL gillar helt enkelt inte den resulterande strängen från NET-leverantören på det sättet och den gör inte parametermatriser så...

Så låt oss bygga en parametermotor:

Det är ingen mening att arbeta med två uppsättningar guider, så sammanfoga dem (dessa är en faktisk List(of String) som innehåller guider, inte något annat, inte 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

Felsökningsutgången är syntaktisk korrekt:

...och de 3 raderna med dessa GUID raderas!

Även:

  • Tömma fångstblock är dåliga eftersom de döljer problem för den enda person som kan fixa det (dig).
  • Du bör använda Option Strict för att undvika att VB gissar vad du menar med vissa saker.



  1. Hur man kör ett SQL Server Agent Job med T-SQL

  2. Hur man vänder ordningen på tecken i en sträng i MySQL

  3. Vad är MySQL? – En introduktion till databashanteringssystem

  4. Hur man ändrar tabell i SQL Server genom att använda Alter Statement - SQL Server / T-SQL självstudie del 35