0

更新

当 '\' 是转义助手时,需要对以下四个字符进行转义 %[]_

  1. http://msdn.microsoft.com/en-us/library/aa933232(v=sql.80).aspx - 喜欢
  2. 在 SQL Server 中转义字符串,以便在 LIKE 表达式中使用它是安全的
  3. 如何在 SQL Server 中转义 _?

问题

尽管我搜索了很多,但在堆栈溢出中我找不到与以下内容完全匹配的问题。

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

1) “样本百分比值记录”

2)“样品免费记录”

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

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

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

  1. 有哪些可能的方法来克服这个问题?
  2. 还有哪些其他字符可能会导致上述代码出现此类问题?

注意:我不能阻止用户输入“%”作为输入

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

编辑

我现在使用的解决方案是转义转义字符不起作用 - SQL LIKE 运算符

    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;
        }
4

1 回答 1

1

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

如果您可以使用 aList<T>而不是 a Collection<T>(请参见此处),则可以更简洁地编写:

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

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

var results = new Collection<Log>((
    from o in logs
    where String.IsNullOrEmpty(descr) ||
            o.LogDescription.Contains(descr)
    select o
).ToList());
于 2012-11-15T09:47:27.167 回答