SQL 命令 c# 未获得正确的结果

本文关键字:结果 命令 SQL | 更新日期: 2023-09-27 18:31:14

我正在运行以下查询

cmd = new SqlCommand("SELECT * FROM addresses WHERE identifier NOT IN(@notIn)", _connector.getMsConnection());

当我查看值 notIn 并复制此查询时,我的数据库上得到一个空结果(我期待)。但是,当我运行此代码时,我得到 6 个结果。例如,字符串 notIN 的内容是

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

结合

SELECT * 
FROM addresses 
WHERE identifier NOT IN(@notIn)

应该创建

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

按预期运行。

SQL 命令 c# 未获得正确的结果

它应该是这样的:

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

这样,notIn 的值将连接到您的字符串查询。

与其他

答案所说的相反,连接字符串以构建SQL是一个坏主意,特别是因为输入值是字符串。你让自己面临SQL注入攻击。

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

例如,如果您有输入输入:

var notIn = new[] { "A1", "B2", "C3" }

你想要类似的东西

for(var i = 0; i < notIn.Length; i++)
    command.AddParamWithValue("p"+i, notIn);

然后你可以用串联来构建 SQL(请注意,我们在这里没有连接输入

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)

或者,您可以将值转储到临时表中并执行联接。

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

这是因为,您将@notIn作为整个字符串传递,这意味着SQL服务器将其视为:

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

所以你得到了空的结果

尝试将"not in"更改为where子句,并使用C#生成where:

string selectStatement = "SELECT * FROM addresses WHERE";
selectStatement += " identifier != '201619011124027899693E8M2S3WOCKT9G6KHE11' and identifier != '201619011124027899693E8M2S3WOCKT9G6KHE12'";

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