【问题标题】:How to log executed sql statement [duplicate]如何记录执行的sql语句[重复]
【发布时间】:2012-08-09 13:26:26
【问题描述】:

场景

我正在使用 ADO.NET SqlCommand 执行存储过程:

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_Trk_GetSuspiciusVisitor";
cmd.Parameters.Add(new SqlParameter("channel","gb"));
cmd.Parameters.Add(new SqlParameter("data", DateTime.Today.AddDays(-1)));
cmd.Connection = conn;

我想记录执行的 sql 语句。在这种情况下,我想记录字符串:

sp_Trk_GetSuspiciusVisitor 'gb', '2012-08-12'

问题

SqlCommandSqlConnection 类是否有任何属性可以完成这项工作?

【问题讨论】:

  • 该语句永远不会执行 - 当使用参数时,参数化查询和参数列表及其值被发送到 SQL Server。只有在查询中引入了参数值。
  • 日志的目的是什么?更多上下文可能会有所帮助
  • @Marc Gravell:如果我记录 sql 语句,它可以在 sql 客户端中快速执行,以防出现错误、异常、检查或其他情况。
  • 在这种情况下,我将取消删除我的答案;我认为该工具真的可以帮助解决这个问题

标签: c# ado.net sqlcommand


【解决方案1】:

没有魔法 方法可以做到这一点,但是有许多工具可以很好地与 ADO.NET 配合使用来捕捉正在发生的事情。例如,mini-profiler 通过包装 ADO.NET 来做到这一点,这通常只涉及对“创建连接”代码的一次更改——然后它会在内部记录操作。该代码是开源的,因此将其调整为您自己的日志记录框架将是微不足道的。

例如,如果我去(登录)到 SEDE,并查看一个随机页面 here, say,我可以看到所有记录的 SQL 操作(无需更改代码即可获取此日志记录)@987654323 @ - 或者在不可用的情况下:

唯一的小故障是您明确使用了SqlParameter,这可能需要更改为cmd.CreateParameter()。或者,使用 dapper 之类的东西更容易:

conn.Execute("sp_Trk_GetSuspiciusVisitor",
    new { channel = "gb", data = DateTime.Today.AddDays(-1) },
    commandType: CommandType.StoredProcedure);

请注意,上面显示的declare 语句不是原始查询的一部分;该工具已添加这些以方便在 SSMS 等中运行查询。

【讨论】:

    【解决方案2】:

    不,不幸的是,您必须遍历所有参数以获取它们的值并将其与命令文本连接

    【讨论】:

    • 是的,我就是这样做的。如果没记错的话,我可能已经使访问变得漂亮了(我想到了命令上的 ToString 的扩展方法),但在幕后我最终对参数进行了 foreach。但这有其优势,因为我还能够输出值和方向。令人惊讶的是这对调试有多么有用!
    【解决方案3】:

    或编辑您的存储过程以进行日志记录,方法是对其进行编辑以添加等效项:

    insert into my_sp_log 
    values ('sp_trk_getSuspiciousVisitor', @channel, @data, getdate())
    

    【讨论】:

    • 是的,但是如果调用失败,你根本就不会登录
    最近更新 更多