Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Kueri dinamis menggunakan nomor variabel argumen IN (p1, p2, p3)

Dari komentar:

depToDelete dan otherToDelete adalah daftar(string) yang lolos dari pemanggilan fungsi. Ini memegang 1 atau banyak panduan yang ingin saya hapus

Untuk itu, kode Anda tidak memformatnya dengan benar untuk SQL. Untuk daftar 2 Guid Strings, setelah bergabung Anda mendapatkan ini:

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

Kemudian, strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77) rupanya ingin mencoba menghilangkan tanda kutip dan menggantinya dengan tanda centang. Masalahnya adalah string itu sendiri tidak menyertakan Quote. Anda melihatnya di IDE karena itulah cara VS memberi tahu Anda bahwa itu adalah string.

SubString langkah adalah memangkas karakter Panduan yang valid dari hasil (dan Angka Ajaib 77 memungkinkannya mogok ketika tidak ada jumlah yang tepat):

Sebelum:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&Setelah:"b842f14-7932-4e3d-8483-07790ccc674c,...

Ini tidak akan berfungsi karena isinya bukan Panduan yang sangat panjang. Setiap elemen di List perlu dicentang. Untuk mencentang setiap elemen dalam daftar, Anda perlu mengulang dan membuat string, atau gunakan linq.

Tapi itu juga tidak akan berhasil. MySQL tidak menyukai string yang dihasilkan dari penyedia NET seperti itu dan tidak melakukan array parameter jadi...

Jadi mari kita buat mesin parameter:

Tidak ada gunanya bekerja dengan 2 set Panduan, jadi gabungkan mereka (ini adalah List(of String) yang sebenarnya berisi panduan, bukan sesuatu yang lain, bukan 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

Output debug secara sintaksis benar:

...dan 3 baris dengan GUID tersebut akan dihapus!

Juga:

  • Blok Tangkap Kosong buruk karena menyembunyikan masalah dari satu-satunya orang yang dapat memperbaikinya (Anda).
  • Anda harus menggunakan Option Strict untuk menghindari VB menebak apa yang Anda maksud dengan hal-hal tertentu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Subquery Sederhana dengan OuterRef

  2. Tingkatkan WAMP ke MySQL 5.5?

  3. Bagaimana cara memasukkan array nilai ke dalam kolom yang berbeda dari tabel mysql?

  4. Bagaimana mencegah melebihi max_user_connections saat memuat ulang/menyegarkan halaman beberapa kali?

  5. Koneksi pdo tanpa nama database?