टिप्पणियों से:
depToDelete और otherToDelete सूची (स्ट्रिंग की) हैं जो एक फ़ंक्शन कॉल से गुजरती हैं। इनमें 1 या कई गाइड हैं जिन्हें मैं हटाना चाहता हूं
उसके लिए, आपका कोड इसे SQL के लिए सही ढंग से प्रारूपित नहीं करता है। 2 गाइड स्ट्रिंग्स की सूची के लिए, जुड़ने के बाद आपको यह मिलेगा:
"af489fbf-982a-49de-b73e-2ac3f3192225, 0feab28d-4f96-456a-9f36-0a0376627128"
फिर, strOtherToDelete = strOtherToDelete.Replace(Chr(34), Chr(39)).Substring(1, 77)
जाहिरा तौर पर उद्धरण को हटाने और एक टिक के साथ बदलने की कोशिश करना चाहता है। समस्या यह है कि स्ट्रिंग में ही उद्धरण शामिल नहीं है। आप इसे आईडीई में देखते हैं क्योंकि वीएस आपको यह बताने का तरीका है कि यह एक स्ट्रिंग है।
SubString
चरण परिणाम से मान्य ग्रिड वर्णों को ट्रिम कर रहा है (और एक जादुई संख्या 77
जब उनकी सही संख्या न हो तो इसे क्रैश होने देता है):
इससे पहले:"9b842f14-7932-4e3d-8483-07790ccc674c, ...
&के बाद:"b842f14-7932-4e3d-8483-07790ccc674c,...
यह काम नहीं करेगा क्योंकि सामग्री एक बहुत लंबी गाइड नहीं है। प्रत्येक तत्व List
में टिक करने की जरूरत है। सूची में प्रत्येक तत्व पर टिक करने के लिए आपको लूप और एक स्ट्रिंग बनाने की आवश्यकता है, या linq का उपयोग करें।
लेकिन वह भी काम नहीं करेगा। MySQL इस तरह से NET प्रदाता से परिणामी स्ट्रिंग को पसंद नहीं करता है और यह पैरामीटर सरणियों को नहीं करता है...
तो चलिए एक पैरामीटर इंजन बनाते हैं:
गाइड के 2 सेट के साथ काम करने का कोई मतलब नहीं है, इसलिए उन्हें एक साथ रखें (ये एक वास्तविक List(of String)
हैं। गाइड युक्त, कुछ और नहीं, जोंस नहीं):
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
डिबग आउटपुट वाक्यात्मक रूप से सही है:
...और उन GUID वाली 3 पंक्तियाँ हटा दी जाती हैं!
इसके अलावा:
- खाली कैच ब्लॉक खराब हैं क्योंकि वे समस्याओं को केवल उसी व्यक्ति से छिपाते हैं जो इसे (आप) ठीक कर सकता है।
- वीबी अनुमान लगाने से बचने के लिए आपको हमें विकल्प सख्त करना चाहिए कि कुछ चीजों से आपका क्या मतलब है।