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.