【问题标题】:how to get LIKE clause to work in ADO.NET and SQL Server如何让 LIKE 子句在 ADO.NET 和 SQL Server 中工作
【发布时间】:2010-04-07 00:37:57
【问题描述】:

我在 ASP.NET 中执行了一个非常简单的查询,但是在我插入 LIKE 子句后它停止工作。

例子:

String sql = " SELECT * 
                 FROM Products 
                WHERE ID = @MYID 
                  AND Name LIKE '%@MYNAME%' ";
SqlCommand command = new SqlCommand(sql, cn);


command.Parameters.AddWithValue("@MYID", MYID.Text);

command.Parameters.AddWithValue("@MYNAME", MYNAME.Text);

如果我删除了 LIKE,它会起作用。因此我认为它与 '' 引号有关?

【问题讨论】:

  • 抱歉,我不得不编辑问题。即使在@MYNAME 我提供了正确的部分字符串,它也返回 0 结果

标签: c# sql ado.net


【解决方案1】:

原始代码混淆了 SQL 语句的文本和参数的内容。您的代码实际上应该如下所示:

string sql = "SELECT * 
              FROM Products 
              WHERE ID = @MyID
              AND Name LIKE @MyName";
using (SqlCommand command = new SqlCommand(sql, cn))
{
    command.Parameters.AddWithValue("@MyID", MyID.Text);
    command.Parameters.AddWithValue("@MyName", "%" + MyName.Text + "%");
    // Etc.
}

% 符号需要作为参数值的一部分,使用绑定参数时根本不需要单引号。

【讨论】:

  • 当 MyName.Text 包含字符 % _ 或 [ 时,这将无法正常工作,假设您要实际搜索这些字符文字之一。对于 100% 的解决方案,您需要将这些字符括在方括号 [] 中。 C# 代码Regex.Replace(searchString, @"([%_\[])", @"[$1]") 可以解决问题。感谢 Matt Miller 指出这一点here
【解决方案2】:

请注意,将 LIKE 与初始通配符一起使用几乎总是非常糟糕的主意,因为查询不会使用该列上的任何索引。在这种情况下,您可能会侥幸逃脱,因为看起来 ID 列上的过滤器会将您限制为一条记录,但通常您需要做的是在 name 列上放置一个全文索引并编写如下查询这个:

... WHERE CONTAINS(name, @MyName)

【讨论】:

  • 只要您要搜索的文本是一个完整的单词(或多个单词)或单词的开头,则为真。如果您要在单词的中间或结尾搜索文本,很遗憾您仍然需要使用LIKE %s%
【解决方案3】:

或者

 String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE @MYNAME ";

当您设置@MYNAME 参数时,适当添加“%”字符 (%SMITH%)。我认为在处理参数时不需要单引号。

【讨论】:

    【解决方案4】:

    不要认为使用绑定参数就像将它的值插入到 SQL 字符串中!绑定参数值作为单独的数据发送到数据库,因此它们不能用引号引起来,也不能包含任何可选的 SQL 代码、表或列名!

    【讨论】:

      【解决方案5】:

      您在传递参数值时缺少% 符号

      command.Parameters.AddWithValue("@MYNAME"+"%", MYNAME.Text);
      

      【讨论】:

      • 不正确,参数名称与 LIKE 模式无关。这应该应用于参数值。
      【解决方案6】:

      sql语句应该是这样的:

      String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + @MYNAME + '%'"; 
      

      我不确定我是否完全理解您的评论,但您似乎想在查询中使用文本框中的值 - 也许这就是您想要做的:

      String sql = " SELECT * FROM Products WHERE ID = @MYID AND Name LIKE '%' + text_box.Text + '%'";
      

      "text_box" 将是您的 textBox 控件的实际 ID。

      【讨论】:

      • 那行不通 :( 我试了一下并打印出下面的 sql:AND NAME LIKE '%System.Web.UI.WebControls.TextBox%'
      • SQL 字符串连接值是错误的(即使它有效):由于没有查询计划重用,性能不佳,SQL 注入风险,如前所述。
      • SQL 注入可能
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多