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' )
按预期运行。
它应该是这样的:
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,请尝试在存储过程中执行此操作。