sql >> Database >  >> RDS >> Mysql

Dynamische query met variabel aantal IN (p1, p2, p3) argumenten

Uit opmerkingen:

depToDelete en otherToDelete zijn lijst(van string) die door een functieaanroep worden doorgegeven. Deze bevatten de 1 of vele hulplijnen die ik wil verwijderen

Daarvoor formatteert uw code het niet correct voor de SQL. Voor een lijst van 2 Guid Strings krijg je na de join dit:

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

Dan, strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77) wil blijkbaar proberen het citaat te verwijderen en te vervangen door een vinkje. Het probleem is dat de string zelf geen Quote bevat. Je ziet het in de IDE, want dat is de manier van VS om je te vertellen dat het een string is.

De SubString stap is het bijsnijden van geldige Guid-tekens uit het resultaat (en een magisch getal van 77 laat het crashen als er niet precies het juiste aantal is):

Vroeger:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&Na:"b842f14-7932-4e3d-8483-07790ccc674c,...

Dit zal niet werken omdat de inhoud niet één erg lange gids is. Elk element in de List aangevinkt hoeft te worden. Om elk element in de lijst aan te vinken, moet je een lus maken en een string bouwen, of linq gebruiken.

Maar dat werkt ook niet. MySQL houdt gewoon niet van de resulterende string van de NET-provider op die manier en het doet geen parameterarrays dus...

Laten we dus een parameters-engine bouwen:

Het heeft geen zin om met 2 sets Guids te werken, dus voeg ze samen (dit is een echte List(of String) met gidsen, niet iets anders, niet 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

De debug-uitvoer is syntactisch correct:

...en de 3 rijen met die GUID's worden verwijderd!

Ook:

  • Empty Catch-blokken zijn slecht omdat ze problemen verbergen voor de enige persoon die het kan oplossen (jij).
  • U moet ons Option Strict gebruiken om te voorkomen dat VB raadt wat u met bepaalde dingen bedoelt.



  1. Wat gebeurt er als MySQL-verbindingen voortdurend niet worden gesloten op PHP-pagina's?

  2. Kan ik Django F()-objecten gebruiken met tekenreeksaaneenschakeling?

  3. MySQL-dump per zoekopdracht

  4. CRUD-bewerking met ASP.NET Core MVC, Entity Framework Core en SQL Server