处理数据选择的特殊字符输入

时间:2012-11-15 07:06:35

标签: c# .net sql-server linq ado.net

更新

当'\'是转义助手%[]_

时,需要转义以下四个字符
  1. http://msdn.microsoft.com/en-us/library/aa933232(v=sql.80).aspx - LIKE
  2. Escape a string in SQL Server so that it is safe to use in LIKE expression
  3. How do I escape _ in SQL Server?
  4. 问题

    虽然我经常搜索,但在堆栈溢出时我找不到与下列内容完全匹配的问题。

    我有一个名为Log_Description的数据库列。它有两个记录。

    1)“样本%值记录”

    2)“免费记录样本”

    我正在使用SQL命令和设置参数,如下所示

    commandText = commandText + “Log_Description LIKE @Log_Description”;
    command.Parameters.AddwithValue(“@Log_Description”, “%”+obj. LogDescription+”%”); 
    

    假设用户输入“%”作为txtLogDescription文本框的搜索参数,我只需要显示第一条记录。但目前它正在显示两个记录。

    1. 有什么方法可以解决这个问题?
    2. 上述代码可能导致此类问题的其他字符是什么?
    3. 注意:我无法阻止用户输入“%”作为输入

      注意:我使用SQL Server作为数据库

      编辑

      我现在使用的解决方案是Escaping the escape character does not work – SQL LIKE Operator

          private static string CustomFormat(string input)
          {
              input = input.Replace(@"\", @"\\");
              input = input.Replace(@"%", @"\%");
              input = input.Replace(@"[", @"\[");
              input = input.Replace(@"]", @"\]");
              input = input.Replace(@"_", @"\_");
              return input;
          }
      

      LINQ 方法(性能命中)低于

              Collection<Log> resultLogs = null;
      
      
              if (!String.IsNullOrEmpty(logSearch.LogDescription))
              {
                  resultLogs = new Collection<Log>();
                  var results = from o in logs where o.LogDescription.Contains(logSearch.LogDescription) select o;
                  if (results != null)
                  {
                      foreach (var log in results)
                      {
                          resultLogs.Add((Log) log);
                      }
                  }
              }
              else
              {
                  resultLogs = logs;
              }
      

1 个答案:

答案 0 :(得分:1)

至于逃避%,请参阅Tommy Grovnes对该问题的评论。

如果您可以使用List<T>代替Collection<T>(请参阅here),则可以更简洁地编写:

var descr = logSearch.logDescription;
var results = (
    from o in logs
    where String.IsNullOrEmpty(descr) ||
            o.LogDescription.Contains(descr)
    select o
).ToList();

如果仍需要Collection<T>,可以在Collection构造函数中包装LINQ查询的结果:

var results = new Collection<Log>((
    from o in logs
    where String.IsNullOrEmpty(descr) ||
            o.LogDescription.Contains(descr)
    select o
).ToList());