如何将List<int>集合的值填充到SQL查询的IN()子句中?
嘿,这个问题我太熟了——你之前尝试的字符串拼接方法虽然看起来能快速凑出SQL,但绝对要避开,因为这会给SQL注入留后门,而且如果集合里有特殊值或者空元素,还容易触发语法错误。下面给你两种安全又靠谱的方案:
方案1:安全的参数化查询(ADO.NET原生实现)
这是最稳妥的原生做法,通过给集合里的每个元素创建独立参数,动态生成参数化SQL,完全杜绝SQL注入风险:
List<int> ls = new List<int> {5,7,9,11}; // 初始化SQL语句,准备拼接参数占位符 string sql = "SELECT Id1 FROM T WHERE Id2 IN ("; var parameters = new List<SqlParameter>(); // 为每个集合元素生成参数和占位符 for (int i = 0; i < ls.Count; i++) { string paramName = $"@p{i}"; sql += paramName; // 如果不是最后一个元素,添加逗号分隔 if (i < ls.Count - 1) sql += ", "; // 将参数和对应值加入参数列表 parameters.Add(new SqlParameter(paramName, ls[i])); } sql += ")"; // 执行查询 using (SqlConnection conn = new SqlConnection("你的数据库连接字符串")) { conn.Open(); using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.Parameters.AddRange(parameters.ToArray()); using (SqlDataReader reader = cmd.ExecuteReader()) { // 读取并处理查询结果 while (reader.Read()) { int id1 = reader.GetInt32(0); // 这里写你需要的业务逻辑 } } } }
方案2:用Entity Framework(ORM简化实现)
如果你项目里用了Entity Framework(EF Core或EF6),那代码会更简洁——LINQ会自动帮你生成参数化的IN查询,完全不用手动拼接SQL:
List<int> ls = new List<int> {5,7,9,11}; using (var dbContext = new YourDbContext()) // 替换成你的DbContext类 { var id1List = dbContext.T .Where(t => ls.Contains(t.Id2)) .Select(t => t.Id1) .ToList(); // id1List就是你要的结果集合 }
为什么不推荐字符串拼接?
举个极端例子:如果你的集合值来自用户输入,恶意用户可能输入1); DROP TABLE T;--,直接拼接后SQL会变成SELECT Id1 FROM T WHERE Id2 IN (1); DROP TABLE T;--),这会直接删除你的T表——这就是SQL注入的危害,所以绝对不能用字符串拼接的方式处理这类查询。
内容的提问来源于stack exchange,提问作者Harshil Doshi
相关产品推荐
相关产品推荐

