You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中编写含多字符串IN子句的SQL查询?

在C#中编写带多字符串IN子句的安全SQL查询

嘿,我来帮你搞定这个问题!你当前的写法有两个明显的问题:一是循环会不断覆盖query变量,最后只会得到针对最后一个SessionID的查询,根本没法实现多值IN的效果;二是直接把字符串拼进SQL里,不仅容易因为特殊字符(比如单引号)导致语法错误,还会面临严重的SQL注入风险,这可是数据库操作的大忌。

下面给你几种安全且高效的实现方式:

方法一:使用参数化查询(最推荐,安全优先)

参数化查询能彻底避免SQL注入,还能让数据库缓存执行计划提升性能。我们可以动态为每个SessionID创建参数,再把参数占位符拼进IN子句里:

List<string> listSessionId = new List<string> { "sess_001", "sess_002", "sess_003" };

// 基础SQL模板,预留IN子句的占位符
string baseQuery = "SELECT OM.ORDERCONFIRMATIONID AS OCN FROM [DGS].[DGSCRM].[LEAD] OM WHERE OM.SESSIONID IN ({0})";

List<string> paramPlaceholders = new List<string>();
SqlCommand sqlCmd = new SqlCommand();

// 为每个SessionID创建参数
for (int i = 0; i < listSessionId.Count; i++)
{
    string paramName = $"@SessionId_{i}";
    paramPlaceholders.Add(paramName);
    // 添加参数并赋值,自动处理字符串转义
    sqlCmd.Parameters.AddWithValue(paramName, listSessionId[i]);
}

// 拼接完整的SQL语句
string finalQuery = string.Format(baseQuery, string.Join(", ", paramPlaceholders));
sqlCmd.CommandText = finalQuery;

// 后续执行逻辑示例(记得用using管理连接)
using (SqlConnection conn = new SqlConnection("你的数据库连接字符串"))
{
    conn.Open();
    using (SqlDataReader reader = sqlCmd.ExecuteReader())
    {
        while (reader.Read())
        {
            // 处理查询结果
            string ocn = reader["OCN"].ToString();
            // ...
        }
    }
}

方法二:用Entity Framework简化操作(如果用ORM的话)

如果你项目里用了Entity Framework(EF Core或EF6),那写法会更简洁,EF会自动帮你生成参数化的IN子句:

List<string> listSessionId = new List<string> { "sess_001", "sess_002", "sess_003" };

using (var dbContext = new YourDbContext())
{
    // 直接用Contains方法,EF会转换成对应的IN子句
    var ocnList = dbContext.LEAD
        .Where(lead => listSessionId.Contains(lead.SESSIONID))
        .Select(lead => lead.ORDERCONFIRMATIONID)
        .ToList();
    
    // 处理查询到的OCN列表
    foreach (var ocn in ocnList)
    {
        // ...
    }
}

为什么不要直接拼接字符串?

举个可怕的例子:如果有人恶意把SessionID设置为'); DROP TABLE [DGS].[DGSCRM].[LEAD]; --,你原来的拼接逻辑会生成这样的SQL:

SELECT OM.ORDERCONFIRMATIONID AS OCN FROM [DGS].[DGSCRM].[LEAD] WHERE SESSIONID in (''); DROP TABLE [DGS].[DGSCRM].[LEAD]; --')

这会直接删除你的LEAD表!参数化查询就能完全避免这种风险。

内容的提问来源于stack exchange,提问作者Huma Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:12:10