2010-04-05 85 views
0

我填充數據集並允許用戶輸入搜索字符串。我沒有再次敲擊數據庫,而是將RowFilter設置爲顯示所選數據。當用戶輸入一個方括號(「[」)時,出現錯誤「Like Operator中的錯誤」。我知道有一個字符列表需要在字段名中使用前綴「\」,但是如何防止RowFilter將「[」作爲列名的開頭?RowFilter包括[搜索字符串中的字符

注意:我正在使用SQL Server的數據集。

回答

1

所以,你正在嘗試使用LIKE子句進行過濾,在那裏你想把「[」或「]」字符解釋爲要被搜索的文本?

從上DataColumn.Expression屬性的Visual Studio幫助:

「如果一個托架是子句中,括號字符應當在方括號(例如[[]或[]])逃脫」。

所以,你可以使用這樣的代碼:

 DataTable dt = new DataTable("t1"); 
     dt.Columns.Add("ID", typeof(int)); 
     dt.Columns.Add("Description", typeof(string)); 

     dt.Rows.Add(new object[] { 1, "pie"}); 
     dt.Rows.Add(new object[] { 2, "cake [mud]" }); 

     string part = "[mud]"; 
     part = part.Replace("[", "\x01"); 
     part = part.Replace("]", "[]]"); 
     part = part.Replace("\x01", "[[]"); 

     string filter = "Description LIKE '*" + part + "*'"; 

     DataView dv = new DataView(dt, filter, null, DataViewRowState.CurrentRows); 

     MessageBox.Show("Num Rows selected : " + dv.Count.ToString()); 

注意,黑客攻擊被使用。字符\ x01(我假設最初不會出現在「部分」變量中)用於臨時替換左括號。右括號轉義後,臨時的「\ x01」字符被替換爲左括號所需的轉義序列。

+0

這個例子很好用。當我嘗試在我的程序(SQL數據庫)中使用相同的技術時,我沒有得到任何結果。看起來像SQL ADO驅動程序是問題的根源?另外,如果我在查詢分析器中嘗試它,尾部括號(「]」)會返回預期結果,但使用前導括號(「[」)不會產生任何結果。使用兩個返回行,其中包含括號中的任何字母。 – 2010-04-07 13:13:29

+0

@Jeff - 聽起來很奇怪。一旦數據位於DataSet中,數據源就是SQL服務器應該沒關係。此外,DataColumn.Expression的LIKE子句與SQL Server的T-SQL LIKE子句不同。 – 2010-04-08 01:56:17