SQL命令c#没有得到正确的结果

SQL命令c#没有得到正确的结果,c#,sql-server,C#,Sql Server,我正在运行以下查询 cmd = new SqlCommand("SELECT * FROM addresses WHERE identifier NOT IN(@notIn)", _connector.getMsConnection()); 当我查看notIn值并复制此查询时,我在数据库中得到一个空结果(这是我所期望的)。然而,当我运行这段代码时,我得到了6个结果。例如,stringnotIN的内容 string notIn = "'201619011124027899693E8M2S3WOC

我正在运行以下查询

cmd = new SqlCommand("SELECT * FROM addresses WHERE identifier NOT IN(@notIn)", _connector.getMsConnection());
当我查看notIn值并复制此查询时,我在数据库中得到一个空结果(这是我所期望的)。然而,当我运行这段代码时,我得到了6个结果。例如,stringnotIN的内容

string notIn = "'201619011124027899693E8M2S3WOCKT9G6KHE11' ,'201619011124027899693E8M2S3WOCKT9G6KHE12'"
结合

SELECT * 
FROM addresses 
WHERE identifier NOT IN(@notIn)
应该创造

SELECT * 
FROM addresses 
WHERE identifier NOT IN ('201619011124027899693E8M2S3WOCKT9G6KHE11', 
                         '201619011124027899693E8M2S3WOCKT9G6KHE12' )

它按预期运行。

应该是这样的:

cmd = new SqlCommand(string.Format("SELECT * FROM addresses WHERE identifier NOT IN({0})", notIn), _connector.getMsConnection());

这样,notIn的值将与字符串查询一致。

这是因为,您将@notIn作为一个完整的字符串传递,这意味着SQL server将其视为:

SELECT * FROM addresses WHERE identifier NOT IN('''201619011124027899693E8M2S3WOCKT9G6KHE11'',''201619011124027899693E8M2S3WOCKT9G6KHE12''')
所以你得到的结果是空的

尝试将“notin”改为where子句,并用C#生成where:


或者,如果您确实想使用参数化SQL,请尝试在存储过程中执行此操作。

与其他答案所说的相反,连接字符串以构建SQL是一个坏主意,尤其是因为输入值是字符串。您将面临SQL注入攻击

您应该为列表中的每个项目生成多个参数

例如,如果您有输入:

var notIn = new[] { "A1", "B2", "C3" }
你会想要像这样的东西

for(var i = 0; i < notIn.Length; i++)
    command.AddParamWithValue("p"+i, notIn);
这看起来像:

SELECT * FROM addresses WHERE identifier NOT IN (@p0,@p1,@p2)
或者,您可以将这些值转储到临时表中并进行连接


请注意,上面的代码是伪代码,可能不会逐字编译,但应该能让您正确了解如何处理。

否决票可以,但请解释原因。
var sql = "SELECT * FROM addresses WHERE identifier NOT IN(" + string.Join(",", notIn.Select(i,v) => { "@p" + i; }) + ")";
SELECT * FROM addresses WHERE identifier NOT IN (@p0,@p1,@p2)