2008-12-22 37 views
20

Tôi muốn biết nếu có một hàm để thoát đúng chuỗi ký tự chuỗi cho các biểu thức lọc. ví dụ:Cách đúng để thoát khỏi các ký tự trong Biểu thức Lọc DataTable

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

Nếu MyName chứa 'hoặc một số ký tự khác ngoại lệ được tạo. Các Microsoft documentation chỉ ra rằng các charaters nên được thoát một cách chính xác, tuy nhiên có một chút nhầm lẫn về cách này được thực hiện.

Tôi đã thử thay thế 'bằng \' và cũng ['] như được chỉ ra trong tài liệu, tuy nhiên truy vấn vẫn không thành công.

Rất cám ơn

+0

Tôi cũng phải đối mặt với cùng một vấn đề, trong trường hợp của tôi, tôi chỉ muốn kiểm tra rằng bất kỳ hàng tồn tại với tên được đặt do đó, tôi đã được sử dụng LINQ cho việc này. 'Data.AsEnumerable(). Ở đâu (hàng => Convert.ToString (hàng [" Tên "]). ToLower(). Bằng (newName.ToLower())).()' – Nilay

Trả lời

6

Nếu tôi thay thế 'bằng hai lần' truy vấn hoạt động.

+3

Đó không phải là DataTable cụ thể, nhưng thay vì cách tổng quát để thực hiện nó trong SQL. :-) – Tomalak

+1

Mặc dù tôi sử dụng truy vấn được tham số hóa, do đó, không đi qua sự cần thiết cho điều này trong SQL. Nhưng tôi có được bạn. – Ady

+0

Nếu bạn sử dụng truy vấn tham số bạn đang ở bên an toàn, nhưng TableFilter là một tập hợp con trong bộ nhớ của SQL, bao gồm mệnh đề WHERE phải tuân theo các quy tắc cú pháp SQL. Nó chỉ là một chuỗi, vì vậy không có thông số ở đây. Đó là lý do tại sao bước bổ sung này phải được thực hiện. – Tomalak

26

Thoát khỏi dấu nháy đơn 'bằng cách tăng gấp đôi nó thành' '. Thoát *% [] ký tự bằng cách gói trong []. ví dụ:

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) + "'"); 
} 

Nhờ examples here

+0

Điều này không hoạt động đối với tôi đối với các chuỗi chứa dấu ngoặc đơn. Chuỗi ** "Hình ảnh [Ba-up]" ** đang được bộ lọc ** tìm thấy "entryBlockName = 'Hình ảnh [Ba-up]'" ** và không phải là bộ lọc ** "entryBlockName = 'Hình ảnh [[] Ba []] '"** –

+2

Ah. Việc thoát khỏi dấu ngoặc đơn chỉ ** khi bộ lọc là mệnh đề LIKE. Không phải khi đó là mệnh đề =. –

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; 
    } 
Các vấn đề liên quan