2009-03-16 10 views
6

के साथ मैं कई प्रश्नों को परिवर्तित करने की प्रक्रिया में हूं जो एप्लिकेशन में हार्ड-कोड किए गए थे और फ्लाई पर पैरामीटर किए गए प्रश्नों के लिए बनाया गया था। मैं एक विशेष क्वेरी, जो एक in खंड है में परेशानी आ रही:सी # पैरामीटरेटेड क्वेरी MySQL 'इन' क्लॉज

UPDATE TABLE_1 SET STATUS = 4 WHERE ID IN (1, 14, 145, 43); 

पहले पैरामीटर आसान है, के रूप में यह सिर्फ एक सामान्य पैरामीटर है:

MySqlCommand m = new MySqlCommand("UPDATE TABLE_1 SET STATUS = ? WHERE ID IN (?);"); 
m.Parameters.Add(new MySqlParameter("", 2)); 

हालांकि, दूसरा पैरामीटर एक है उन पंक्तियों की आईडी का प्रतिनिधित्व करने वाले पूर्णांक की सूची जिन्हें अद्यतन करने की आवश्यकता है। मैं एक पैरामीटर के लिए पूर्णांक की सूची में कैसे पास करूं? वैकल्पिक रूप से, आप इस क्वेरी को सेट करने के बारे में कैसे जाएंगे ताकि आपको इसे हर बार इसे पूरी तरह से निर्माण करने की आवश्यकता न हो, और एसक्यूएल इंजेक्शन हमलों को रोक सके?

+0

http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause की डुप्लिकेट: इस सवाल देखें हालांकि, वास्तव में अलग होने की संभावना नहीं है) –

+0

वहां पेश किए गए समाधान को अविश्वसनीय रूप से धीमा माना जाता था, हालांकि यह मेरे प्रश्न के दूसरे भाग का उत्तर देता है। – Elie

+0

वहां दिए गए * बहुत सारे समाधान हैं। स्वीकृत उत्तर सबसे लोकप्रिय नहीं है। –

उत्तर

4

आप (शायद) मानकों के चर संख्या के आधार पर "मक्खी पर" parametrised क्वेरी का निर्माण कर सकता है, और उस पर पुनरावृति उन में पारित करने के लिए

तो, कुछ की तरह:।

List foo; // assuming you have a List of items, in reality, it may be a List<int> or a List<myObject> with an id property, etc. 

StringBuilder query = new StringBuilder("UPDATE TABLE_1 SET STATUS = ? WHERE ID IN (?") 
for(int i = 1; i++; i < foo.Count) 
{ // Bit naive 
    query.Append(", ?"); 
} 

query.Append(");"); 

MySqlCommand m = new MySqlCommand(query.ToString()); 
for(int i = 1; i++; i < foo.Count) 
{ 
    m.Parameters.Add(new MySqlParameter(...)); 
} 
+0

मैं बस यही सोच रहा था। लेकिन क्या मैंने संग्रहीत पैरामीटरयुक्त क्वेरी होने के प्रदर्शन लाभ प्राप्त किए हैं यदि मैंने ऐसा किया? – Elie

+0

Ado.Net सबसे अच्छा प्रदर्शन एक नया कनेक्शन बनाकर, इसे एक बार उपयोग करके और इसे फेंकने का सुझाव देता है - कम से कम अन्य एसक्यूएल इंजनों के लिए; आखिरकार, क्वेरी इंजन क्वेरी स्ट्रिंग के आधार पर उन्हें पुन: उपयोग करने के लिए अनुकूलित कर सकता है ... –

2

आप एक आईएन क्लॉज के लिए पैरामीटर का उपयोग नहीं कर सकते हैं।

-1

मैं एक फ़ंक्शन बनाने के लिए पैरामीटर को तोड़ने के लिए एक फ़ंक्शन बनाने का सुझाव देता हूं (मान लेता हूं कि MySQL उपयोगकर्ता परिभाषित फ़ंक्शंस का समर्थन करता है)।

0

पूर्णांक की अपनी सूची के चारों ओर लूप करें और व्यक्तिगत अपडेट करें।

MSSQL 2008 इस समस्या से बचने के लिए तालिका-मूल्यवान पैरामीटर प्रदान करता है, मुझे MySQL में किसी भी समान कार्यक्षमता से अवगत नहीं है।

+0

है जो अविश्वसनीय रूप से अक्षम होगा, क्योंकि यह प्रश्न कुछ मामलों में, इन क्लॉज में हजारों आइटम हो सकता है। – Elie

+0

क्या कोई सीमा नहीं है कि आपके पास एक खंड में कितनी चीज़ें हो सकती हैं? – Svish

5

MySQL में यह संभव नहीं है। आप एक आवश्यक संख्या पैरामीटर बना सकते हैं और अद्यतन कर सकते हैं ... IN (?,?,?,?)। यह इंजेक्शन हमलों को रोकता है (लेकिन अभी भी आपको प्रत्येक पैरामीटर गिनती के लिए क्वेरी को पुनर्निर्माण करने की आवश्यकता है)।

अन्य तरीका अल्पविराम से अलग स्ट्रिंग को पार करना और इसे पार्स करना है।

1

पुराना सवाल है, लेकिन इस मामले में किसी को भी इस पर Google के माध्यम से आता है, यहाँ मैं क्या उपयोग है:

int status = 4; 
string ids = "1,14,145,43";  

m.Parameters.AddWithValue("@Status", status); 
m.Parameters.AddWithValue("@IDs", ids); 

UPDATE TABLE_1 SET STATUS = @Status WHERE FIND_IN_SET(ID, @IDs) > 0; 

नोट: FIND_IN_SET एक mySQL विशेष समारोह है।

क्रेडिट, जहाँ क्रेडिट कारण है: (हालांकि कि SQL सर्वर है mysql के बजाय Add List<int> to a mysql parameter

संबंधित मुद्दे