如何记录/获取Dapper Extensions自动生成的SQL查询?

Ami*_*shi 6 c# dapper dapper-extensions

我使用Dapper Extensions(DE)作为ORM.它在使用Repository模式实现的数据访问层中使用.SQL Express是后端RDBMS.

DE会自动为我生成大部分查询.我想记录这些自动生成的查询以进行调试.

我可以通过两种方式来实现这一目标: -

  1. 获取DE生成的SQL查询(在执行之前或之后)并将其写入日志.这是我的首选方式,因为我已经有了我的记录模块(使用log4net).我唯一需要的是DE生成的SQL.
  2. 将DE与一些记录工具集成.我读了这个答案.使用MiniProfiler工具看起来很可能; 但正如我上面所说,我已经有了我的记录模块.我不想仅使用其他工具来记录SQL查询.

如何在不使用任何其他日志记录工具的情况下记录/获取Dapper Extensions自动生成的SQL查询?

其他类似的问题是关于小巧玲珑.这个问题是关于Dapper Extensions.

Ami*_*shi 5

查看@MarcGravell 的评论以及关于使用 Dapper 执行相同操作的问题,MiniProfiler.Integrations是为 Dapper 扩展实现日志记录的更好方法。

上面链接的问题是关于 Dapper 的。但 Dapper Extensions 在内部使用 Dapper。因此,如果为 Dapper 实现了日志记录,那么 Dapper 扩展也同样适用。

更多详细信息可以在GitHub上找到。

示例代码如下:

var factory = new SqlServerDbConnectionFactory(connectionString);
CustomDbProfiler cp = new CustomDbProfiler();
using(var connection = DbConnectionFactoryHelper.New(factory, cp))
{
    //DB Code
}
string log = cp.ProfilerContext.GetCommands();
Run Code Online (Sandbox Code Playgroud)

如果适合您的需要,您可以使用内置CustomDbProfiler使用。无论您调用该方法多少次,都会返回所有命令(成功和失败)。我不确定,但是,它可能在内部维护连接字符串(可能是)。如果是这种情况,可能会降低性能。但是,就我而言,默认情况下禁用日志记录。我仅在需要调试某些内容时启用日志记录。所以这对我来说不是问题。CustomDbProfiler.Currentcp.ProfilerContext.GetCommands()StringBuilder

如果在非常大的范围内使用单个连接,这也可能会引起内存占用问题。为了避免这种情况,请确保CustomDbProfiler正确处置实例。

正如问题中提到的,最初,我想避免这种方式(使用外部工具/库)。但是,MiniProfiler.Integrations不是写日志本身。我可以简单地获取生成的所有查询并将其提供给我的记录器模块以转储到文件中。这就是为什么,现在这看起来更适合我。


MiniProfiler.dll 在内部实现类似的逻辑(在StackExchange.Profiling.Data.ProfiledDbConnection和类中),这在此处此处StackExchange.Profiling.Data.ProfiledDbCommand提到。因此,如果我决定(将来可能)绕过 MiniProfiler,我可以自己使用此实现。