2010-04-07 15 views
8

में काम करने के लिए LIKE क्लॉज कैसे प्राप्त करें I ASP.NET में वास्तव में एक सरल क्वेरी कर रहा हूं, लेकिन LIKE क्लॉज डालने के बाद यह काम करना बंद कर देता है।ADO.NET और SQL सर्वर

उदाहरण:

String sql = " SELECT * 
       FROM Products 
       WHERE ID = @MYID 
        AND Name LIKE '%@MYNAME%' "; 
SqlCommand command = new SqlCommand(sql, cn); 


command.Parameters.AddWithValue("@MYID", MYID.Text); 

command.Parameters.AddWithValue("@MYNAME", MYNAME.Text); 

अगर मैं की तरह हटाया यह काम करता है। इसलिए मैं इसे उद्धरण के साथ करने के बारे में सोच रहा हूं?

+0

क्षमा करें, मुझे प्रश्न संपादित करना पड़ा। यह 0 परिणाम लौटा, भले ही @MYNAME में मैंने सही आंशिक स्ट्रिंग – noobplusplus

उत्तर

-12

एसक्यूएल बयान इस तरह दिखना चाहिए:

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + @MYNAME + '%'"; 

मुझे यकीन है कि मैं पूरी तरह से अपनी टिप्पणी से समझा नहीं गया हूँ, लेकिन ऐसा लगता है आप अपनी क्वेरी में एक टेक्स्ट बॉक्स से मान का उपयोग करना चाहते हैं - शायद यह क्या है आप करने की कोशिश कर रहे हैं:

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + text_box.Text + '%'"; 

"text_box" आपके टेक्स्टबॉक्स नियंत्रण की वास्तविक आईडी होगी।

+0

की आपूर्ति की जो काम नहीं करता :(मैंने कोशिश की और एसक्यूएल को नीचे देखें: और नाम '% System.Web.UI.WebControls.TextBox एसक्यूएल इंजेक्शन भेद्यता के लिए% ' – noobplusplus

+15

-1। – Aaronaught

+2

मूल्यों का एसक्यूएल स्ट्रिंग कॉन्सटेनेशन WRONG है (भले ही यह काम करता है): कोई क्वेरी प्लान पुन: उपयोग करने के कारण खराब प्रदर्शन, एसक्यूएल इंजेक्शन जोखिम, जैसा कि पहले से कहा गया है। –

0

या

String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE @MYNAME "; 

और जब आप @MYNAME पैरामीटर सेट, "%" वर्ण उचित रूप से (% स्मिथ%) जोड़ें। मुझे नहीं लगता कि जब आप पैरामीटर से निपट रहे हों तो आपको सिंगल कोट्स की आवश्यकता होगी।

1

बस एक नोट यह कहने के लिए कि प्रारंभिक वाइल्डकार्ड के साथ LIKE का उपयोग करना लगभग हमेशा बहुत बुरा विचार है, क्योंकि क्वेरी उस कॉलम पर किसी भी अनुक्रमणिका का उपयोग नहीं करेगी। इस मामले में आप शायद इससे दूर हो सकते हैं क्योंकि ऐसा लगता है कि आईडी कॉलम पर फ़िल्टर आपको एक रिकॉर्ड तक सीमित कर देगा, लेकिन आम तौर पर आपको इसके बजाय क्या करना होगा, नाम कॉलम पर एक पूर्ण-पाठ अनुक्रमणिका डालें और क्वेरी लिखें यह:

... WHERE CONTAINS(name, @MyName) 
+0

जब तक आप पाठ को सही करते हैं 'खोज रहे हैं एक पूर्ण शब्द (या शब्द) या एक शब्द की शुरुआत है। यदि आप किसी शब्द के अंत में या अंत में पाठ की खोज कर रहे हैं, तो दुर्भाग्यवश आपको अभी भी 'LIKE% s%' – Aaronaught

26

मूल कोड पैरामीटर की सामग्री के साथ SQL कथन के पाठ को भ्रमित कर रहा है। आपका कोड वास्तव में इस तरह दिखना चाहिए:

string sql = "SELECT * 
       FROM Products 
       WHERE ID = @MyID 
       AND Name LIKE @MyName"; 
using (SqlCommand command = new SqlCommand(sql, cn)) 
{ 
    command.Parameters.AddWithValue("@MyID", MyID.Text); 
    command.Parameters.AddWithValue("@MyName", "%" + MyName.Text + "%"); 
    // Etc. 
} 

% संकेत पैरामीटर मान का हिस्सा बनने की जरूरत है, और जब बंधन मानकों का प्रयोग करके आप सब पर एकल उद्धरण की जरूरत नहीं है।

+1

यह MyName के ठीक से काम नहीं करेगा।टेक्स्ट में वर्ण% _ या [है, मानते हैं कि आप वास्तव में उन चार्टर अक्षरों में से किसी एक को खोजना चाहते हैं। 100% समाधान के लिए, आपको उन वर्णों को स्क्वायर ब्रैकेट [] में लपेटने की आवश्यकता है। सी # कोड 'Regex.Replace (searchString, @ "([% _ \ [])", @ "[$ 1]")' चाल है। मैट मिलर को यह इंगित करने के लिए धन्यवाद [यहां] (http://stackoverflow.com/questions/665129/use-of-sqlparameter-in-sql-like-clause-not-working)। – Dejan

-1

आप जबकि पैरामीटर मान गुजर % संकेत याद कर रहे हैं

command.Parameters.AddWithValue("@MYNAME"+"%", MYNAME.Text); 
+0

सही नहीं है, पैरामीटर नाम LIKE पैटर्न पर कोई असर नहीं है। यह पैरामीटर मान पर लागू होना चाहिए। – Lankymart

0

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