[英]How to pass null in SQL IN Clause through ado.net query
我正在将员工 ID 列表传递给我的 ado.net 查询。 有时我的列表是空的,所以在这种情况下我会出错。
错误提示: Incorrect syntax near ')'.
这是我的代码:
var emps = String.Join(",", empList.Keys);
StringBuilder sql = new StringBuilder(
$@"select [Id]
FROM [Test].[dbo].[Employees]
Where [Id] NOT IN {emps}"
);
事先检查您的 emp 列表,如果列表不为空,则仅将 WHERE 子句添加到 StringBuilder。 sql 字符串中还有一个额外的 ')',
其中 [Id] 不在 {emps} 中)
您需要将其删除。
您发布的 SQL 中存在很多问题,但您似乎是说您将一遍又一遍地运行此 SQL,每次添加更多 ID 以排除。 也许你做了一些不断发现应该被忽略的新 ID 的事情
考虑:
using var con = new SqlConnection(...);
for(..some..ongoing..iterative..process){
empList = ..get new IDs here..
var sql = "select [Id] from [Test].[dbo].[Employees] ";
if(empList.Count > 0){
sql += $"where [Id] NOT IN ({string.Join(",", empList.Select((kvp,i) => $"@p{i}"))})";
}
using var cmd = new SqlCommand(sql, con);
//it's a no-op if 0 values
cmd.Parameters.AddRange(empList.Select((kvp,i) => new SqlParameter($"@p{i}", SqlDbType.Int) { Value = kvp.Value }));
..execute here..
}
你在哪里打开和关闭你的con
取决于计算出你的新身份需要多长时间。 如果每次都是几毫秒,那么在循环之前打开它应该没有问题。 如果获取新 ID 需要很长时间,请在您需要的时候打开骗局
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.