4

设想

我正在使用 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'

问题

SqlCommand做这项工作的类或类是否有任何属性SqlConnection

4

3 回答 3

4

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

例如,如果我去(登录)到 SEDE,并查看一个随机页面,例如,我可以在此处查看所有记录的 SQL 操作(无需更改代码即可获取此日志记录),或者以防万一变得不可用:

在此处输入图像描述

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

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

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

于 2012-08-13T10:27:54.627 回答
1

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

于 2012-08-13T10:18:32.337 回答
0

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

insert into my_sp_log 
values ('sp_trk_getSuspiciousVisitor', @channel, @data, getdate())
于 2012-08-13T10:23:18.197 回答