使用WHERE .. IN条件创建SQL查询使用整数列表

时间:2018-03-20 23:04:16

标签: c# sql sql-injection

我不是SQL专家,我想要实现的目标如下。

我有一个名为PersonIds的整数列表。首先,我需要将这个整数列表转换为字符串列表。为什么?因为据我所知,SQL中的WHERE .. IN条件是我需要提供给查询的变量。

然后我需要修改字符串列表以防止SQL注入,从而在列表的每个@之前插入Id

最后,我创建了查询并提供了刚刚创建的列表。

我试图做的是:

var listIds = string.Join(",@", PersonIds, 0, PersonIds.Count()));
var query = $"DELETE FROM PersonTable WHERE PersonId IN (@{listIds})";

我做错了。总结一下,我需要采取措施:

  1. 准备我需要提供给查询的列表(包括避免SQL注入的机制)
  2. 使用我创建的列表作为参数创建查询
  3. 提前致谢!

1 个答案:

答案 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)语法略有不同。