sql >> Database teknologi >  >> RDS >> Mysql

Dynamisk forespørgsel ved hjælp af variabelt antal IN (p1, p2, p3) argumenter

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.



  1. hvordan randomisere hentning af spørgsmål fra databasen?

  2. Hvordan STRCMP() virker i MariaDB

  3. Den nemmeste måde at tilføje flere mellemrum til en streng i MySQL – SPACE()

  4. Nye metadata-kun kolonneændringer i SQL Server 2016