• DbCommandInterceptor抓取EF执行时的SQL语句


    EF6.1也出来不少日子了,6.1相比6.0有个很大的特点就是新增了System.Data.Entity.Infrastructure.Interception 命名空间,此命名空间下的对象可以允许我们更加方便的了解到EF运行时的一些信息,当然我们最想看的还是EF生成的Sql语句,话不多讲,开始干吧;

    public class EFIntercepterLogging : DbCommandInterceptor
        {
    
            ILog log = LogManager.GetLogger("InfoAppender");
            private readonly Stopwatch _stopwatch = new Stopwatch();
            public override void ScalarExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
            {
                SaveCmdSql(command);
                base.ScalarExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
            public override void ScalarExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
            {
                _stopwatch.Stop();
                SaveCmdSql(command);
                if (interceptionContext.Exception != null)
                {
                    Trace.TraceError("Exception:{1} rn --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    Trace.TraceInformation("rn执行时间:{0} 毫秒rn-->ScalarExecuted.Command:{1}rn", _stopwatch.ElapsedMilliseconds, command.CommandText);
                }
                base.ScalarExecuted(command, interceptionContext);
            }
            public override void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
            {
                SaveCmdSql(command);
                base.NonQueryExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
            public override void NonQueryExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
            {
                _stopwatch.Stop();
                SaveCmdSql(command);
                if (interceptionContext.Exception != null)
                {
                    Trace.TraceError("Exception:{1} rn --> Error executing command:rn {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    Trace.TraceInformation("rn执行时间:{0} 毫秒rn-->NonQueryExecuted.Command:rn{1}", _stopwatch.ElapsedMilliseconds, command.CommandText);
                }
                base.NonQueryExecuted(command, interceptionContext);
            }
            /// <summary>
            /// 读取操作
            /// </summary>
            /// <param name="command"></param>
            /// <param name="interceptionContext"></param>
            public override void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
            {
                SaveCmdSql(command);
                base.ReaderExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
            public override void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)
            {
                _stopwatch.Stop();
                SaveCmdSql(command);
                if (interceptionContext.Exception != null)
                {
                    Trace.TraceError("Exception:{1} rn --> Error executing command:rn {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    Trace.TraceInformation("rn执行时间:{0} 毫秒 rn -->ReaderExecuted.Command:rn{1}", _stopwatch.ElapsedMilliseconds, command.CommandText);
                }
                base.ReaderExecuted(command, interceptionContext);
            }
            //保存执行的sql语句
            public void SaveCmdSql(DbCommand command)
            {
                log.Info(command.CommandText);
            }
    
        }

    最后在Global.asax中注册下这个。

    就可以记录sql语句了。

    //EF监控
    DbInterception.Add(new EFIntercepterLogging());

    转自:https://www.cnblogs.com/lgxlsm/p/6305816.html

  • 相关阅读:
    判断ImageIcon创建成功
    Node中的explorer views的双击事件
    Oracle数据类型
    Sql三种行转列
    数据库迁移
    并发采集同一站点被封的解决方案
    .net获取版本号的三种方法
    List转DataSet
    Orcale自增长主键
    python学习笔记数字和表达式
  • 原文地址:https://www.cnblogs.com/souphm/p/10904473.html
Copyright © 2020-2023  润新知