0
我填充數據集並允許用戶輸入搜索字符串。我沒有再次敲擊數據庫,而是將RowFilter設置爲顯示所選數據。當用戶輸入一個方括號(「[」)時,出現錯誤「Like Operator中的錯誤」。我知道有一個字符列表需要在字段名中使用前綴「\」,但是如何防止RowFilter將「[」作爲列名的開頭?RowFilter包括[搜索字符串中的字符
注意:我正在使用SQL Server的數據集。
我填充數據集並允許用戶輸入搜索字符串。我沒有再次敲擊數據庫,而是將RowFilter設置爲顯示所選數據。當用戶輸入一個方括號(「[」)時,出現錯誤「Like Operator中的錯誤」。我知道有一個字符列表需要在字段名中使用前綴「\」,但是如何防止RowFilter將「[」作爲列名的開頭?RowFilter包括[搜索字符串中的字符
注意:我正在使用SQL Server的數據集。
所以,你正在嘗試使用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」字符被替換爲左括號所需的轉義序列。
這個例子很好用。當我嘗試在我的程序(SQL數據庫)中使用相同的技術時,我沒有得到任何結果。看起來像SQL ADO驅動程序是問題的根源?另外,如果我在查詢分析器中嘗試它,尾部括號(「]」)會返回預期結果,但使用前導括號(「[」)不會產生任何結果。使用兩個返回行,其中包含括號中的任何字母。 – 2010-04-07 13:13:29
@Jeff - 聽起來很奇怪。一旦數據位於DataSet中,數據源就是SQL服務器應該沒關係。此外,DataColumn.Expression的LIKE子句與SQL Server的T-SQL LIKE子句不同。 – 2010-04-08 01:56:17