2008-12-22 6 views
20

मैं जानना चाहता हूं कि फ़िल्टर अभिव्यक्तियों के लिए स्ट्रिंग अक्षर से सही ढंग से बचने के लिए कोई फ़ंक्शन है या नहीं। उदाहरण:डेटाटेबल फ़िल्टर अभिव्यक्ति में वर्णों से बचने के लिए सही तरीका

DataTable.Select(String.Format("[name] = '{0}'", MyName)) 

यदि MyName में 'या कई अन्य प्रमुख वर्ण शामिल हैं तो अपवाद उत्पन्न होता है। Microsoft documentation इंगित करता है कि इन charaters सही ढंग से बच जाना चाहिए, हालांकि यह कैसे किया जाना है पर भ्रम है।

मैंने दस्तावेज में संकेत के अनुसार 'साथ \' और ['] को बदलने की कोशिश की है, हालांकि क्वेरी अभी भी विफल हो गई है।

बहुत धन्यवाद

+0

को मैं भी यही मुद्दा का सामना करना पड़ रहा हूँ, मेरे मामले में मैं सिर्फ यह देखना होगा कि किसी भी पंक्ति में दिया गया नाम तो मैं इस बात के लिए इस्तेमाल किया गया था LINQ के साथ मौजूद हैं चाहता हूँ। 'Data.AsNumerable()। कहां (पंक्ति => कनवर्ट करें। टॉस्ट्रिंग (पंक्ति [" नाम "])। ToLower()। बराबर (newName.ToLower()))। कोई भी()' – Nilay

उत्तर

6

यदि मैं 'दो एकल के साथ' क्वेरी को प्रतिस्थापित करता हूं तो क्वेरी काम करता है।

+3

यह डेटाटेबल विशिष्ट भी नहीं है, लेकिन एसक्यूएल में इसे करने का सामान्य तरीका। :-) – Tomalak

+1

हालांकि मैं पैरामीटरयुक्त प्रश्नों का उपयोग करता हूं, इसलिए SQL में इसकी आवश्यकता पूरी नहीं हो पाएं। लेकिन मैं तुम्हें मिलता हूँ। – Ady

+0

यदि आप पैरामीटरयुक्त क्वेरी का उपयोग करते हैं तो आप सुरक्षित पक्ष पर हैं, लेकिन एक टेबलफिल्टर एसक्यूएल का एक इन-मेमोरी सबसेट है, जिसमें WHERE क्लॉज शामिल है जो SQL वाक्यविन्यास नियमों के अनुरूप होना चाहिए। यह सिर्फ एक स्ट्रिंग है, इसलिए यहां कोई पैरामीटर नहीं है। यही कारण है कि यह अतिरिक्त कदम उठाया जाना चाहिए। – Tomalak

26

एकल उद्धरण से 'इसे दोगुना करके' से बचें। [] में लपेटकर *% [] अक्षर से बचें। उदा।

private string EscapeLikeValue(string value) 
{ 
    StringBuilder sb = new StringBuilder(value.Length); 
    for (int i = 0; i < value.Length; i++) 
    { 
     char c = value[i]; 
     switch (c) 
     { 
      case ']': 
      case '[': 
      case '%': 
      case '*': 
       sb.Append("[").Append(c).Append("]"); 
       break; 
      case '\'': 
       sb.Append("''"); 
       break; 
      default: 
       sb.Append(c); 
       break; 
     } 
    } 
    return sb.ToString(); 
} 

public DataRow[] SearchTheDataTable(string searchText) 
{ 
    return myDataTable.Select("someColumn LIKE '" 
           + EscapeLikeValue(searchText) + "'"); 
} 

धन्यवाद examples here

+0

यह ब्रैकेट युक्त तारों के लिए मेरे लिए काम नहीं कर रहा है। स्ट्रिंग ** "इमेजेस [थ्री-अप]" ** फ़िल्टर ** "एंट्रीब्लॉकनाम = 'इमेजेस [थ्री-अप]' ** ** और फ़िल्टर नहीं है **" प्रविष्टिब्लॉकनाम = 'छवियों [[] थ्री-अप []] '' ** –

+2

आह। ब्रैकेट से बचना ** केवल ** है जब फ़िल्टर एक समान खंड है। नहीं जब यह एक = खंड है। –

0
/// <summary> 
    /// <para>If a pattern in a LIKE clause contains any of these special characters * % [ ], those characters must be escaped in brackets [ ] like this [*], [%], [[] or []].</para> 
    /// <para>If the pattern is not in a like clause then you can pass valueIsForLIKEcomparison = false to not escape brackets.</para> 
    /// <para>Examples:</para> 
    /// <para>- strFilter = "[Something] LIKE '%" + DataTableHelper.EscapeLikeValue(filterValue) + "%'";</para> 
    /// <para></para> 
    /// <para>http://www.csharp-examples.net/dataview-rowfilter/</para> 
    /// </summary> 
    /// <param name="filterValue">LIKE filterValue. This should not be the entire filter string... just the part that is being compared.</param> 
    /// <param name="valueIsForLIKEcomparison">Whether or not the filterValue is being used in a LIKE comparison.</param> 
    /// <returns></returns> 
    public static string EscapeFilterValue(string filterValue, bool valueIsForLIKEcomparison = true) 
    { 
     string lb = "~~LeftBracket~~"; 
     string rb = "~~RightBracket~~"; 
     filterValue = filterValue.Replace("[", lb).Replace("]", rb).Replace("​*", "[*​]").Replace("%", "[%]").Replace("'", "''"); 
     if (valueIsForLIKEcomparison) 
     { 
      filterValue = filterValue.Replace(lb, "[").Replace(rb, "]"); 
     } 
     else 
     { 
      filterValue = filterValue.Replace(lb, "[[]").Replace(rb, "[]]"); 
     } 

     return filterValue; 
    } 
संबंधित मुद्दे