【问题标题】:C# how to call “sp_executesql” with custom parameters and sql bodyC#如何使用自定义参数和sql主体调用“sp_executesql”
【发布时间】:2018-11-07 14:55:50
【问题描述】:

我正在尝试从 C# 执行动态 SQL,我想使用 sp_executesql,因为我想传递一个字符串列表,用于传递给 sp_executesql 的动态 SQL 中的 IN 语句。

问题是我不知道该怎么做。

到目前为止,我是这样做的:

using (var dbCommand = databaseConnection.CreateCommand())
{
    dbCommand.CommandType = CommandType.StoredProcedure;
    dbCommand.CommandText = "sp_executesql";

    var sqlParam = dbCommand.CreateParameter();
    sqlParam.DbType = DbType.String;
    sqlParam.ParameterName = "stmt";
    sqlParam.Value = sql.SQL;
    dbCommand.Parameters.Add(sqlParam);

    var incidentIdParam = dbCommand.CreateParameter();
    incidentIdParam.ParameterName = "incidentId";
    incidentIdParam.DbType = DbType.Int32;
    incidentIdParam.Value = arguments.filterAttributes.incidentId;
    dbCommand.Parameters.Add(incidentIdParam);

    dbCommand.ExecuteReader();
}

这样可以吗?

【问题讨论】:

  • 从客户端代码执行sp_executesql 没有什么意义,因为客户端代码已经可以参数化任何语句并在必要时执行文本替换。通过将CommandText 设置为sql.SQL 并将CommandType 设置为Text,您将获得(几乎)相同的效果。请注意,即使使用 sp_executesql,您也不能参数化 IN 子句——您只能以文本方式替换它,或使用表值参数。请参阅here,但请务必阅读已接受的答案(这是一个肮脏的黑客)。
  • 我想通了,你需要为IN子句中的每个元素生成一个参数:stackoverflow.com/questions/9384446/…

标签: c# sql-server sp-executesql


【解决方案1】:

作为一个选项,您可以在客户端格式化您的 SQL 并传递给存储过程就绪字符串。例如:

sql.SQL = "UPDATE ORDERS SET STATUS = 1 WHERE ID = %param%";

然后

sqlParam.Value = sql.SQL.Replace("%param%", arguments.filterAttributes.incidentId.ToString());

【讨论】:

  • 为什么不简单地使用参数呢?您的方法容易受到 SQL 注入攻击。尽可能避免走捷径。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多