Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

IN (p1, p2, p3) तर्कों की चर संख्या का उपयोग करके गतिशील क्वेरी

टिप्पणियों से:

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 पंक्तियाँ हटा दी जाती हैं!

इसके अलावा:

  • खाली कैच ब्लॉक खराब हैं क्योंकि वे समस्याओं को केवल उसी व्यक्ति से छिपाते हैं जो इसे (आप) ठीक कर सकता है।
  • वीबी अनुमान लगाने से बचने के लिए आपको हमें विकल्प सख्त करना चाहिए कि कुछ चीजों से आपका क्या मतलब है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL अद्यतन IF शर्त का उपयोग कर

  2. क्वेरी समाप्त होने से पहले क्वेरी परिणाम देखना शुरू करें

  3. कॉलम गिनती पंक्ति में मूल्य गणना से मेल नहीं खाती है, लेकिन यह करता है

  4. MySQL डेटाबेस प्रदर्शन देने के लिए युक्तियाँ - भाग दो

  5. Django चाइल्ड रो को जोड़ या अपडेट नहीं कर सकता:एक विदेशी कुंजी बाधा विफल हो जाती है