zoukankan      html  css  js  c++  java
  • DbCommandInterceptor抓取EF执行时的SQL语句

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

        /// <summary>
        /// 抓取EF执行时的SQL语句
        /// </summary>
        public class EFIntercepterLogging : DbCommandInterceptor
        {
            private readonly Stopwatch _stopwatch = new Stopwatch();
    
            public override void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
            {
                base.ScalarExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
    
            public override void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
            {
                _stopwatch.Stop();
                if (interceptionContext.Exception != null)
                {
                    Trace.TraceError("Exception:{1} 
     --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    Trace.WriteLine("线程:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                    Trace.TraceInformation("
    执行时间:{0} 毫秒
    -->ScalarExecuted.Command:{1}
    ", _stopwatch.ElapsedMilliseconds, command.CommandText);
                }
                base.ScalarExecuted(command, interceptionContext);
            }
    
            public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
            {
                base.NonQueryExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
    
            public override void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
            {
                _stopwatch.Stop();
                if (interceptionContext.Exception != null)
                {
                    Trace.TraceError("Exception:{1} 
     --> Error executing command:
     {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    Trace.TraceInformation("
    执行时间:{0} 毫秒
    -->NonQueryExecuted.Command:
    {1}", _stopwatch.ElapsedMilliseconds, command.CommandText);
                }
                base.NonQueryExecuted(command, interceptionContext);
            }
    
            public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
            {
                //command.CommandText += " AND 1=1";
                base.ReaderExecuting(command, interceptionContext);
                _stopwatch.Restart();
            }
    
            public override void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
            {
                _stopwatch.Stop();
                if (interceptionContext.Exception != null)
                {
                    Trace.TraceError("Exception:{1} 
     --> Error executing command:
     {0}", command.CommandText, interceptionContext.Exception.ToString());
                }
                else
                {
                    Trace.WriteLine("线程:" + System.Threading.Thread.CurrentThread.ManagedThreadId);
                    Trace.TraceInformation("
    执行时间:{0} 毫秒 
     -->ReaderExecuted.Command:
    {1}", _stopwatch.ElapsedMilliseconds, command.CommandText);
                }
                base.ReaderExecuted(command, interceptionContext);
            }
        }
    //EF监控
    DbInterception.Add(new EFIntercepterLogging());
  • 相关阅读:
    顺序表的C语言实现
    Nginx模块开发(5)————开发简单的HTTP过滤模块
    python集合(set)
    python——封装、解构
    python——杨辉三角
    python——bytes、bytearray
    python算法——求10万以内的质数
    python算法——打印菱形、对等三角、闪电
    python字符串操作
    python—冒泡排序
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/6305816.html
Copyright © 2011-2022 走看看