新闻中心

C# Dapper如何记录执行的SQL Dapper SQL日志记录方法

2025-12-15
浏览次数:
返回列表
推荐使用 Dapper v2.1+ 的 IDbCommandInterceptor 实现 SQL 日志,通过重写 BeforeExecute 方法记录 CommandText 和 Parameters;兼容旧版可包装 IDbConnection;手动拼接 SQL 仅限临时调试。

c# dapper如何记录执行的sql dapper sql日志记录方法

在使用 Dapper 时,默认不输出执行的 SQL 语句,但可以通过几种轻量、实用的方式实现 SQL 日志记录,无需引入重型 ORM 日志框架(如 Serilog + EF 集成)。核心思路是利用 Dapper 的 IDbConnection 扩展能力或包装连接对象,捕获命令执行前的 SQL 和参数。

方法一:使用 IDbCommandInterceptor(推荐,Dapper v2.1+)

Dapper 2.1 起原生支持拦截器(IDbCommandInterceptor),可统一监听所有命令执行过程。这是最干净、侵入性最小的方式。

  • 创建一个实现 IDbCommandInterceptor 的类,重写 BeforeExecute 方法,在其中记录 SQL、参数、连接信息
  • 通过 Dapper.DefaultCommandInterceptor = new YourSqlLogger(); 全局注册
  • BeforeExecute 中可访问 command.CommandTextcommand.Parameters(注意:参数值需遍历获取,部分参数类型需特殊处理,如 DbNull 或数组)

示例片段:

  public class SqlLogger : IDbCommandInterceptor
  {
    public void BeforeExecute(IDbCommand command)
    {
      var sql = command.CommandText;
      var paramStr = string.Join(", ", command.Parameters.Cast().Select(p => $"{p.ParameterName}={p.Value ?? "NULL"}"));
      Console.WriteLine($"[SQL] {sql} | Params: {paramStr}");
    }
    // 其他方法可空实现
  }

启动时注册:Dapper.DefaultCommandInterceptor = new SqlLogger();

MarsCode MarsCode

字节跳动旗下的免费AI编程工具

MarsCode 339 查看详情 MarsCode

方法二:包装 IDbConnection(兼容老版本 Dapper)

适用于 Dapper IDbConnection,在 CreateCommand() 返回前注入日志逻辑。

  • 封装原始连接(如 SqlConnection),所有方法委托调用
  • 重写 CreateCommand(),返回自定义 IDbCommand 包装器
  • 在包装后的 Execute* 方法中记录 SQL,再调用原命令执行
  • 适合单元测试 Mock,也便于结合 DI 容器(如注册为 Scoped 服务)

方法三:手动拼接 SQL(仅调试用,不推荐生产)

借助 Dapper.SqlMapper.GenerateSql(内部 API,不稳定)或第三方扩展(如 DapperExtensions),或自己解析匿名对象/ExpandoObject 参数生成占位符 SQL。但该方式无法还原真实执行 SQL(尤其含动态条件、多表 JOIN 时),且不包含实际参数值类型和 DbNull 处理,仅适合快速验证逻辑。

  • 不要用于生产环境日志,易出错、不可靠
  • 可配合 CommandDefinitionFlags(如 CommandFlags.None)做临时调试开关

基本上就这些。优先用拦截器(方法一),简洁稳定;若项目暂不能升级 Dapper,选连接包装(方法二);手动生成 SQL 仅作临时辅助,别当真。

以上就是C# Dapper如何记录执行的SQL Dapper SQL日志记录方法的详细内容,更多请关注其它相关文章!


# 中文网  # 随州营销网站建设  # 海港区网站推广公司  # 项目营销推广活动优化  # 好的网站品牌推广怎么做  # 黄埔企业网站建设推广  # 洗地机营销号风格推广  # 蝴蝶仙子软文推广网站  # 英语文章网站建设文案  # 哈尔滨网站优化流程  # 河北好的网站建设方案  # app  # 可以通过  # 相关文章  # 适用于  # 推荐使用  # 遍历  # 拦截器  # 这是  # 如何使用  # 重写  # c# 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: MAC怎么在地图App里使用“四处看看”_MAC体验部分城市的3D实景街景  qq游戏手机版下载安装_qq游戏移动端入口  Lar*el Excel导入时生成自定义递增ID的策略与实践  Python多版本共存与虚拟环境管理深度指南  Python字典中优雅地迭代剩余元素的方法  J*a实现学校排课程序_面向对象结构化项目示例  Node.js 中使用 node-cron 实现定时 API 数据抓取与处理  Yandex官方入口网址 Yandex俄罗斯搜索引擎最新在线地址  sublime如何优雅地处理行尾空格_sublime自动清理多余空白字符配置  J*aScript中如何高效提取对象指定属性  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】  俄罗斯Yandex搜索引擎入口_Yandex官网免登录一键访问  星露谷物语官网入口 星露谷物语游戏官网入口  Win11文件资源管理器卡顿怎么修 Win11重置资源管理器进程优化响应速度【修复方法】  火锅吃太多会怎样 火锅吃太多会上火吗  微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  Python模块化编程:有效管理依赖与避免循环引用  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台  自定义Bag-of-Words实现:处理带负号的词汇权重  邮政快递包裹最新位置 邮政快递实时追踪入口  Golang如何使用net/url解析URL_Golang URL解析与处理方法  黑猫投诉统一入口官网 消费者权益保护投诉平台  解决J*aScript中重复选择项的确认对话框显示问题  Win10如何清理注册表垃圾 Win10注册表维护与优化指南【慎用】  Go语言中对Map值调用带指针接收者方法:原理与最佳实践  曝R星经典之作开发图 设计简陋但信息密集!  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  谷歌google账号注册详细步骤 谷歌账号注册官方教程  html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】  优化Log4j2控制台输出性能:解决异步日志瓶颈  Win11怎么开启高性能模式_Windows 11电源计划优化设置  fishbowl官网免费版 fishbowl养鱼网站入口  从OpenAI API响应中高效提取生成文本  TypeScript/J*aScript:高效查找数组中首个唯一ID对象  C++ explicit关键字防止隐式转换_C++构造函数安全规范  如何使用Go和Martini动态服务解码后的图片  快手极速版在线观看 官方网页版登录地址  Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性  Go语言HTML解析:利用Goquery精准获取指定元素内容  AO3最新可访问网址 Archive of Our Own官方在线入口  高德地图怎么看全景照片_高德地图全景照片浏览教程  Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  QQ邮箱网页版入口登录 QQ邮箱在线邮箱官方通道  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析 

搜索