有两种方法可以记录执行的SQl语句:

· 使用DbContext.Database.Log属性

· 实现IDbCommandInterceptor接口

1使用DbContext.Database.Log属性

下面截图显示了Database属性和Log属性,可以看出这个属性是一个委托,类型为Action

对Log属性的解释为:

Set this property to log the SQL generated by the System.Data.Entity.DbContext to the given delegate. For example, to log to the console, set this property to System.Console.Write(System.String).

使用方法

1)在自定义上下文中获得执行的SQL相关信息,即在自定上下文的构造函数中使用Database.Log

///  /// 自定义上下文 ///  [DbConfigurationType(typeof(MySqlEFConfiguration))] public class CustomDbContext : DbContext { public CustomDbContext() : base("name=Master") {  //this.Configuration.LazyLoadingEnabled = false; //new DropCreateDatabaseIfModelChanges() //new DropCreateDatabaseAlways() Database.SetInitializer(null); this.Database.Log = Log; } public DbSet Users { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); EntityConfiguration.Set(modelBuilder); } private void Log(string cmd) { //或输出到控制台 //Console.Write(cmd); //或输出到文件 //using (StreamWriter sw = new StreamWriter(@"E:EFCmdLogger.txt")) //{ // sw.WriteLine(cmd); //} //或输出到调试信息窗口 Debug.WriteLine(cmd); }}

执行结果如下截图

2)在具体的方法中使用

public class EFOPerations { //单线程 public static void ReadUser() { Stopwatch stw = new Stopwatch(); stw.Start(); using (CustomDbContext db = new CustomDbContext()) { db.Database.Log = Console.WriteLine; User user = db.Users.Find(1); var userDTO = new { Account = user.Account }; } stw.Stop(); var time = stw.ElapsedMilliseconds; }}

注意

db.Database.Log = Console.WriteLine;

这条语句的位置,如果将其放到查询语句,即User user = db.Users.Find(1);之后则无法输出信息!

改变日志的格式:

创建继承自DatabaseLogFormatter的类,实现新的格式化器,然后使用

System.Data.Entity.DbConfiguration.SetDatabaseLogFormatter(System.Func,System.Data.Entity.Infrastructure.Interception.DatabaseLogFormatter>)

DatabaseLogFormatter的三个方法

  • LogCommand:在SQL 语句或存储过程执行前记录它。
  • LogParameter:记录参数,默认被LogCommand调用(未能验证这一点)
  • LogResult:记录SQL 语句或存储过程执行后的一些相关信息

这三个方法包含的参数为:

  • DbCommand command:SQL 语句或存储过程相关的信息。
  • DbCommandInterceptionContext interceptionContext:执行结果相关的信息。
  • DbParameter parameter:System.Data.Common.DbCommand 的参数。

重写LogCommand或LogResult都可以改变SQL 语句或存储过程相关信息格式,但是注意这两个方法interceptionContext参数的值可能会不一样。

继承DatabaseLogFormatter,实现自定义格式化器

public class CustomDatabaseLogFormatter : DatabaseLogFormatter { public CustomDatabaseLogFormatter(DbContext context, Action writeAction) : base(context, writeAction) { } public override void LogCommand(DbCommand command, DbCommandInterceptionContext interceptionContext) { } public override void LogResult(DbCommand command, DbCommandInterceptionContext interceptionContext) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < command.Parameters.Count; i++) { sb.AppendLine(string.Format("参数名称:{0},值:{1}

如何在sql存储过程中打log_教你如何记录Entity Framework框架自动生成的SQL语句相关推荐

  1. oracle存储过程日志打印,如何在oracle存储过程中逐行打印

    我正在执行一个存储过程,但它在某个时候失败了, 当前错误代码不帮我找到错误的位置和确切位置 我想知道它正在失败,所以想要在执行时逐行输出. 例如:如何在oracle存储过程中逐行打印 create o ...

  2. 在SQL存储过程中给条件变量加上单引号

    在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @wher ...

  3. Entity Framewrok 7beta7中不同版本sql server自动生成分页sql语句的问题

    在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp{[Key]public Guid No { get; set; }public int ...

  4. 自动生成卡密SQL脚本(转载)

    Comments - 446 自动生成卡密SQL脚本(转载) Code if exists (select * from dbo.sysobjects where id = object_id(N'[ ...

  5. 如何在sql存储过程中打log_SQL语句优化

    如何定位并优化慢查询 SQL?大致思路如下: 根据慢查询日志定位慢查询 SQL: 使用 explain 等工具分析 SQL: 修改 SQL 或者尽量让 SQL 走索引. 获取有性能问题的 SQL 的 ...

  6. SQL存储过程中QUOTED_IDENTIFIER和ANSI_NULLS

    SET ANSI_NULLS:   当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT ...

  7. sql存储过程中分隔字符串

    最近遇到了如下问题,要向用户角色信息表中插入数据. 每个用户有多个角色,因此每次添加用户要添加一到多条记录. 这个过程要放到存储过程中实现,但是存储过程不能传入集合. 解决思路是,将角色Id集合转成用 ...

  8. mysql 存储过程 条件_如何在MySQL存储过程中正确实现条件?

    要在存储过程中设置条件,请使用以下语法-if yourCondition then yourStatement1; else yourStatement2'; end if ; end // 让我们实 ...

  9. SQL Server2008 用编写脚本自动生成的Sql语言出现 “列名显示无效 ”错误

    在SQLServer2008中,当设计(修改)表结构之后,再用SQL语句时,列名会显示无效. 原因SQL Server的intellisense功能,在界面用快捷键Ctrl+Shift+R更新即可 关 ...

最新文章

  1. php 中memcache的应用场景,php当中的memcache应用
  2. 提升注意力模块性能dcanet
  3. IDEA中安装MyBatis Log Plugin插件完整显示执行的mybatis的sql语句
  4. iOS Xcode4.2代码管理工具的使用
  5. MySQL 数据类型和 Java 数据类型对照表
  6. 解决Mac10.13 Pod报错 -bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.fram
  7. 2007 Office System Beta2 Technical Refresh 下载
  8. python爬app视频_python爬取抖音APP视频教程
  9. 安装包 — 夜神模拟器下载地址
  10. 传智播客 GIL(全局解释器锁)学习
  11. QT与Coin3D实现机器人的仿真
  12. 解决XeLaTex编译后中文出现乱码的问题
  13. 密码技术学习(8.1)-数字证书简介
  14. 检查php语法错误,PHP检查语法错误技巧
  15. 祝贺父亲节快乐的python代码_2019祝爸爸父亲节快乐的最新父亲节祝福说说句子大全...
  16. 朋友圈爱心拼图php源码_朋友圈爱心形配图怎么弄 微信朋友圈九宫格心形拼图教程方法...
  17. UVM中p_sequencer和m_sequencer的用法及其区别
  18. 学习批处理之安装一键装机必备软件
  19. adobe imageready怎么扣图
  20. ESP32 开发笔记(四)littleVGL LVGL 控件学习 Arc 弧形控件

热门文章

  1. 一语点破Java中的静态static关键字
  2. 在Oracle中写出性能优良的SQL语句
  3. nubiax系统Android p正式版,nubia X更新 升级为基于Android P的JOS
  4. 架构模式: 服务器端页面碎片化元素构建
  5. 12篇文章带你逛遍主流分割网络
  6. licode学习之erizo篇--Pipeline_service
  7. saltsack之数据系统(三)
  8. Shiro学习(24)在线回话管理
  9. step 3 socket
  10. 面向对象(基础oop)之继承总结