Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Truy vấn động sử dụng số lượng biến đối số IN (p1, p2, p3)

Từ nhận xét:

depToDelete và otherToDelete là danh sách (của chuỗi) chuyển từ một lệnh gọi hàm. Những thứ này chứa 1 hoặc nhiều rãnh mà tôi muốn xóa

Vì vậy, mã của bạn không định dạng chính xác cho SQL. Để biết danh sách 2 Chuỗi hướng dẫn, sau khi tham gia, bạn sẽ nhận được điều này:

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

Sau đó, strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77) dường như muốn cố gắng loại bỏ báo giá và thay thế bằng một đánh dấu. Vấn đề là bản thân chuỗi không bao gồm một Trích dẫn. Bạn thấy nó trong IDE vì đó là cách của VS cho bạn biết nó là một chuỗi.

SubString bước là cắt các ký tự Hướng dẫn hợp lệ từ kết quả (và Số ma thuật của 77 cho phép nó gặp sự cố khi không chỉ có đúng số lượng trong số chúng):

Trước:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&Sau:"b842f14-7932-4e3d-8483-07790ccc674c,...

Điều này sẽ không hoạt động vì nội dung không phải là một Hướng dẫn quá dài. Mỗi phần tử trong List cần được đánh dấu. Để đánh dấu vào từng phần tử trong danh sách, bạn cần lặp và tạo một chuỗi hoặc sử dụng linq.

Nhưng điều đó cũng sẽ không hoạt động. MySQL không thích chuỗi kết quả từ nhà cung cấp NET theo cách đó và nó không làm mảng tham số nên ...

Vì vậy, hãy xây dựng một công cụ tham số:

Không có ý nghĩa gì khi làm việc với 2 bộ Guid, vì vậy hãy ghép chúng lại với nhau (đây là một List(of String) chứa guids, không phải thứ khác, không phải 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

Đầu ra gỡ lỗi đúng về mặt cú pháp:

... và 3 hàng có các GUID đó sẽ bị xóa!

Ngoài ra:

  • Các khối Catch trống không tốt vì chúng ẩn các vấn đề với người duy nhất có thể khắc phục nó (bạn).
  • Bạn nên cho chúng tôi Tùy chọn Nghiêm ngặt để tránh VB đoán ý bạn về những điều nhất định.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PDO ::rowCount VS COUNT (*)

  2. Lỗi mã hóa PHP khi tạo XML từ cơ sở dữ liệu

  3. Kích hoạt MYSQL:JSON_SEARCH một giá trị số nguyên trong một mảng json các số nguyên

  4. Làm cách nào để tạo ra các lỗi nghiêm trọng của TẤT CẢ các cảnh báo mysql?

  5. cách cung cấp cùng một số sê-ri cho nhóm bản ghi trong mysql