gpt4 book ai didi

c# - 如何在 C# 中为 IN 子句编写 sql 查询文本

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:23 24 4
gpt4 key购买 nike

我想知道如何在 C# 中编写 sql 查询,其中我必须在 IN 子句中使用多个字符串。

我有一个 List ListSessionId,我想在我的 IN 子句中使用它们中的每一个。

类似于:

foreach (var sessionid in ListSessionId)
{
query = " SELECT OM.ORDERCONFIRMATIONID AS OCN ";
query += " FROM [DGS].[DGSCRM].[LEAD] ";
query += " WHERE ";
query += " SESSIONID in ('" + sessionid + "') ";
}

所以我的查询是这样的:

SELECT OM.ORDERCONFIRMATIONID AS OCN
FROM [DGS].[DGSCRM].[LEAD]
WHERE
SESSIONID in ('sessionid1', 'sessionid2', 'sessionid3')

最佳答案

虽然您可以使用字符串 .join 来解决这个问题或者只是迭代你的循环来构建你的 IN 括号之间的东西子句,它会让您对 SQL 注入(inject)敞开大门。

为避免这种情况,您必须参数化您对 SQL 字符串的输入。我们通过使用 sql 命令 .Parameters 来做到这一点类。

它看起来像:

var query = "SELECT OM.ORDERCONFIRMATIONID AS OCN FROM [DGS].[DGSCRM].[LEAD] SESSIONID in ({0})"; 

var idParameterList = new List<string>();
var index = 0;
foreach (var sessionid in ListSessionId)
{
var paramName = "@idParam" + index;
sqlCommand.Parameters.AddWithValue(paramName, sessionid);
idParameterList.Add(paramName);
index++;
}
sqlCommand.CommandText = String.Format(query, string.Join(",", idParameterList));

请注意,我完全是在猜测您的 sqlCommand变量名称,但您可以根据需要将其换掉。

有了这个,我们将 SQL 字符串/命令分成两个 block

  1. sql 本身。这最终被提交到数据库看起来像 SELECT OM.ORDERCONFIRMATIONID AS OCN FROM [DGS].[DGSCRM].[LEAD] SESSIONID in (@idParam0, @idParam1, @idParam3, ... @idParamN) .数据库获取此 sql 字符串并对其进行编译,就好像其中包含值一样。它确定执行路径,并只是坐在上面等待第二部分中的值通过

  2. 参数的值进来了。这是我们在循环中构建的列表。 ListSessionId 中的每个值与新的 sqlCommand.Parameters 配对取一个名字 @idParam0@idParam1

因为你的 SQL 是在你的 ListSessionID 中没有任何实际内容的情况下编译的糟糕的 SQL 无法在您的数据库中显示和执行。它已编译并准备好执行。因此,当参数命中时,它会运行 sql 语句的计划并 barfs 返回结果。漂亮干净。

关于c# - 如何在 C# 中为 IN 子句编写 sql 查询文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49858620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com