【问题标题】:BindingSource.Filter crashing (injection)BindingSource.Filter 崩溃(注入)
【发布时间】:2013-06-11 15:32:28
【问题描述】:

所以我有一些简单的代码:

source.Filter = "n LIKE '%" + txtSearch.Text + "%'";

Source 是一个 BindingSource 对象。

txtSearch 是一个文本框。

什么是正确的方法来确保它总是将txtSearch.Text 的内容视为一个字符串,并且每次我输入一个“(”或一些其他字符(还不确定是哪个)时都不会崩溃。

肯定有一个函数可以在某处逃避所有这些,还是什么?

【问题讨论】:

    标签: c# bindingsource


    【解决方案1】:

    刚遇到同样的问题,从http://www.csharp-examples.net/dataview-rowfilter/找到了这个解决方案

    public static string EscapeLikeValue(string valueWithoutWildcards)
    {
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < valueWithoutWildcards.Length; i++)
      {
         char c = valueWithoutWildcards[i];
         if (c == '*' || c == '%' || c == '[' || c == ']')
           sb.Append("[").Append(c).Append("]");
         else if (c == '\'')
           sb.Append("''");
         else
         sb.Append(c);
       }
       return sb.ToString();
    }
    

    【讨论】:

      【解决方案2】:

      没有内置函数。但是,您仍然可以像这样编写自己的扩展方法:

      public static string RemoveSpecialCharacters(this string str)
      {
         StringBuilder stringBuilder  = new StringBuilder();
         foreach (char c in str)
          {
            if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') ||
                (c >= 'a' && c <= 'z') || c == '.' || c == '_') 
            {
               stringBuilder.Append(c);
            }
         }
         return stringBuilder.ToString();
      }
      

      你的代码会变成

      source.Filter = "n LIKE '%" + txtSearch.Text.RemoveSpecialCharacters() + "%'";
      

      注意:

      您可以将方法重命名为合适的方法。我使用这个名称只是为了您的理解。

      【讨论】:

      • -1 真的不是。通过这种方式,您只需删除每个非 ASCII 字符(对于非美国客户来说不是非常适合的解决方案)。有different rules 可以转义该字符串。
      • @Adriano 这只是一个示例方法。我已经要求 OP 自己写这样一个。假设他会根据他的文化和地区跳过字符
      • 我不能同意,他必须编写自己的方法,但这样做的方法是不要丢弃未知字符。他应该转义他知道的字符具有特殊含义,其他一切都必须保持不变。
      • 是的,抱歉回复速度太慢了,我需要这些字符,我不能把它们扔掉。我发现此问题存在的方式是在搜索包含这些字符的有效结果时。如果没有显示结果,则进行搜索毫无意义。
      • @Matty 你不会再使用这些字符了吧?
      【解决方案3】:

      为什么不在原始查询中包含搜索字符串作为参数?我唯一一次使用 BindingSource.Filter 是当我想按我知道存在的数据进行过滤时,即用特定列上的所有可能值填充 CheckedListBox 并允许用户选择要查看的数据。

      另一种方法是从特殊字符中捕获异常并通过向用户发送消息来处理它。

      【讨论】:

      • 我愿意,但没有原始查询,它只是一个 XML 文件。名单相当大。部分问题是我需要允许括号,所以我不能忽略它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多