我想知道如何在C#中编写sql查询,其中必须在IN子句中使用多个字符串。
我有一个ListListSessionId,我想在我的IN子句中使用它们中的每一个。
就像是:
foreach (var sessionid in ListSessionId)
{
query = " SELECT OM.ORDERCONFIRMATIONID AS OCN ";
query += " FROM [DGS].[DGSCRM].[LEAD] ";
query += " WHERE ";
query += " SESSIONID in ('" + sessionid + "') ";
}
Run Code Online (Sandbox Code Playgroud)
所以我的查询是这样的:
SELECT OM.ORDERCONFIRMATIONID AS OCN
FROM [DGS].[DGSCRM].[LEAD]
WHERE
SESSIONID in ('sessionid1', 'sessionid2', 'sessionid3')
Run Code Online (Sandbox Code Playgroud)
尽管您可以使用字符串来解决此问题,也可以.join仅迭代循环以在IN子句中的括号之间建立填充,但是这将使您为SQL注入敞开大门。
为避免这种情况,您必须将输入参数化为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 sessiond in ListSessionId)
{
var paramName = "@idParam" + index;
sqlCommand.Parameters.AddWithValue(paramName, sessionid);
idParameterList.Add(paramName);
index++;
}
sqlCommand.CommandText = String.Format(query, string.Join(",", idParameterList));
Run Code Online (Sandbox Code Playgroud)
请注意,我完全猜到了您的sqlCommand变量名,但是您可以根据需要将其换出。
有了这个,我们将我们的SQL字符串/命令分为两个块
sql本身。最终看起来像一样被提交到数据库SELECT OM.ORDERCONFIRMATIONID AS OCN FROM [DGS].[DGSCRM].[LEAD] SESSIONID in (@idParam0, @idParam1, @idParam3, ... @idParamN)。数据库获取此sql字符串并对其进行编译,就好像它中包含值一样。它确定执行路径,然后坐在它上面,等待第二部分中的值通过
传入参数的值。这是我们在循环中构建的列表。您中的每个值ListSessionId都会与一个新的配对,该新sqlCommand.Parameters名称@idParam0或名称为或@idParam1,等等。
因为您的SQL是在编译时没有任何实际内容的,ListSessionID所以无法在数据库中显示和执行错误的SQL。它已编译并准备执行。因此,当参数命中时,它将运行sql语句的计划,并返回结果。干净整洁。
您可以使用 Linq 并使用参数来解决此问题,这对于确保您的代码免受 Sql 注入攻击至关重要。使用参数时,请务必同时指定参数类型和长度(如果适用)。我猜长度为 100,类型为VarChar,您可以根据需要进行调整。
// create the parameters
var parameters = ListSessionId.Select((sessionId, indx) => new SqlParameter("@session_" + indx, SqlDbType.VarChar, 100) {Value = sessionId}).ToArray();
// create the query
command.CommandText = $"SELECT OM.ORDERCONFIRMATIONID AS OCN FROM [DGS].[DGSCRM].[LEAD] WHERE SESSIONID IN ({string.Join(",", parameters.Select(x=>x.ParameterName))})";
// add parameters to the command
sqlCommand.Parameters.AddRange(parameters);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1754 次 |
| 最近记录: |