我不是SQL专家,我想要实现的目标如下。
我有一个名为PersonIds
的整数列表。首先,我需要将这个整数列表转换为字符串列表。为什么?因为据我所知,SQL中的WHERE .. IN
条件是我需要提供给查询的变量。
然后我需要修改字符串列表以防止SQL注入,从而在列表的每个@
之前插入Id
。
最后,我创建了查询并提供了刚刚创建的列表。
我试图做的是:
var listIds = string.Join(",@", PersonIds, 0, PersonIds.Count()));
var query = $"DELETE FROM PersonTable WHERE PersonId IN (@{listIds})";
我做错了。总结一下,我需要采取措施:
提前致谢!
答案 0 :(得分:7)
也许最简单的方法是添加一些Dapper:
List<int> listIds = ...
connection.Execute("DELETE FROM PersonTable WHERE PersonId IN @listIds",
new { listIds });
Dapper完成所有艰苦的工作,找出如何参数化,同时仍然几乎接近常规TSQL。如果您使用最新版本的SQL Server,还可以选择启用string_split
用法,以最大限度地减少参数计数和查询计划缓存大小。
请注意,缺少的括号是故意的和有意的 - dapper将这与常规IN (@foo, @bar)
语法略有不同。