2010-04-05 86 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