如何让LIKE子句在ADO.NET和SQL Server中工作

我在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它的工作原理。 因此,我在考虑它与”引用?

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语句的文本与参数的内容混淆。 您的代码应该看起来像这样:

 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. } 

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

只是说明使用LIKE和初始通配符几乎总是一个非常糟糕的主意 ,因为查询不会使用该列上的任何索引。 在这种情况下,您可能可以逃脱,因为看起来ID列上的filter会将您限制为一条记录,但通常您需要做的是在名称列上放置一个全文索引并像写一样查询这个:

 ... WHERE CONTAINS(name, @MyName) 

要么

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

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

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

传递参数值时缺少%符号

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