C#中的MSSQL查询,从字符串获取WHERE子句的一部分

C#中的MSSQL查询,从字符串获取WHERE子句的一部分,c#,sql-server,C#,Sql Server,我正在使用以下代码: string str = "ID = 15"; using (SqlCommand cmd = new SqlCommand("SELECT * " + "FROM Cutomer" + " Where (Status='Umbruch') and '"+str+"' " , con)) 我得到这个错误: nea

我正在使用以下代码:

string str = "ID = 15";

using (SqlCommand cmd = new SqlCommand("SELECT * " + 
                                       "FROM Cutomer" + 
                                       " Where (Status='Umbruch') and '"+str+"' " , con))
我得到这个错误:

near 'ID = 15' is a non boolean expression specified in a context where a condition is expected. 
我知道我可以像这样使用上述代码:

int id = 15; 

using (SqlCommand cmd = new SqlCommand("SELECT * " + 
                                       "FROM Cutomer" + 
                                       " Where (Status='Umbruch') and (ID='"+str+"')" , con))

它像这样工作很好,但我想像上面第一段代码中提到的那样使用它。因为ID的数量不是固定的,所以它们可以是2、3或更多。为了简单起见,我把代码放在这里

你在这里把它变成文字:

using (SqlCommand cmd = new SqlCommand("SELECT * " + 
                                       "FROM Cutomer" + 
                                       " Where (Status='Umbruch') and '"+str+"' " , con))
应该是:

using (SqlCommand cmd = new SqlCommand("SELECT * " + 
                                       "FROM Cutomer" + 
                                       " Where (Status='Umbruch') and "+str, con))
请注意删除
时的细微差别


此外,请说明为什么您对SQL注入持开放态度,以及为什么您需要利用参数化SQL而不是原始SQL。

第一个版本应该是(从第二个“工作”查询中,您需要15左右的简单引号,而不是整个表达式)

顺便说一下,您应该使用用户参数,而不是直接字符串


如果需要IN子句,您可能会看到一个简单的错误,不要在字符串前后加单引号

using (SqlCommand cmd = new SqlCommand("SELECT * FROM Cutomer " + 
                                       "WHERE (Status='Umbruch') AND " + str , con))
当然,这假定您的ID字段是数字字段,而不是文本字段。
在后一种情况下,应该在15常量周围加上单引号

string str = "ID = '15'";
作为补充,请记住字符串串联非常危险,因为您的代码可能会被简单的攻击所利用。在这种非常特殊的情况下,不可能进行注射

如果从用户输入中收到要搜索的ID,请不要使用字符串连接来生成sql命令。而是使用参数化查询

 using (SqlCommand cmd = new SqlCommand("SELECT * FROM Cutomer " + 
                               " Where (Status='Umbruch') and ID=@custID" , con))
 {
      cmd.Parameters.AddWithValue("@custID", 15);
      ......
 }

因为正确使用此
ID='15'
而不是
'ID=15'
?您有一个SQL注入漏洞。您能解释一下ID字段是文本还是数字吗?@Steve ID字段是数字的,因此您不需要在where子句所使用的字符串中的任何位置使用单引号。但我重复一遍,保存并使用参数化query@SLaks:您是指
str
应该是
ID='15'
?只有当键实际上是一个
VARCHAR
yes时,哪个才是真的?换句话说,如果键是
VARCHAR
,则
ID=15
不起作用,但是如果键是
INT
@MichaelPerrenoud,则两者都起作用。它不是这样工作的。我有一个语法错误,在+strr+,con)。错误是:无效的表达式术语“,”@Kami,是否是我在第一次编辑时遗漏的
str
变量之后的无关
+
 using (SqlCommand cmd = new SqlCommand("SELECT * FROM Cutomer " + 
                               " Where (Status='Umbruch') and ID=@custID" , con))
 {
      cmd.Parameters.AddWithValue("@custID", 15);
      ......
 }