首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何记录/获得由Dapper扩展自动生成的SQL查询?

如何记录/获得由Dapper扩展自动生成的SQL查询?
EN

Stack Overflow用户
提问于 2017-05-25 14:57:33
回答 1查看 7.1K关注 0票数 6

我使用Dapper扩展(DE)作为ORM。它是在数据访问层中使用的,数据访问层采用存储模式来实现。是后端的RDBMS.

DE自动为我生成大多数查询。为了调试目的,我想记录那些自动生成的查询。

有两种方法可以实现这一点:-

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

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

其他类似的问题是关于Dapper的。这个问题是关于Dapper扩展的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-15 12:23:48

查看@MarcGravell和中关于使用Dapper进行同样操作的问题,MiniProfiler.Integrations是实现Dapper扩展日志记录的更好方法。

以上问题是关于Dapper的。但是Dapper扩展在内部使用Dapper。因此,如果为Dapper实现了日志记录,那么Dapper扩展的工作也是一样的。

更多细节可以在GitHub上找到。

示例代码如下:

代码语言:javascript
复制
var factory = new SqlServerDbConnectionFactory(connectionString);
CustomDbProfiler cp = new CustomDbProfiler();
using(var connection = DbConnectionFactoryHelper.New(factory, cp))
{
    //DB Code
}
string log = cp.ProfilerContext.GetCommands();

如果适合您的需要,可以使用内置CustomDbProfiler使用CustomDbProfiler.Current。无论调用方法多少次,cp.ProfilerContext.GetCommands()都会返回所有命令(成功和失败)。我不确定,但它可能是在内部维护串连字符串(StringBuilder可能是)。如果是这样的话,这可能会减慢性能。但是,在我的例子中,默认情况下日志记录是禁用的。我只在需要调试某些东西时才启用日志记录。所以这对我来说不是问题。

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

正如前面提到的,最初,我想避免这种方式(使用外部工具/库)。但是,MiniProfiler.Integrations并不是在自己编写日志。我可以简单地获取生成的所有查询,并将这些查询提供给我的记录器模块以转储到文件中。所以,我现在觉得这个更合适。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44183650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档