如何记录执行的sql语句

时间:2012-08-13 10:14:06

标签: c# ado.net sqlcommand

方案

我正在使用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类的任何属性可以完成这项工作?

3 个答案:

答案 0 :(得分:3)

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

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

enter image description here

唯一的小问题是您明确使用SqlParameter,可能需要更改为cmd.CreateParameter()。或者,使用像dapper这样的东西来简化:

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

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

答案 1 :(得分:1)

不,遗憾的是,您必须遍历所有参数才能获取其值并将其与命令文本连接

答案 2 :(得分:0)

或编辑存储过程以通过编辑来执行日志记录,以添加等效的:

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