使用EntityFramework6.1的DbCommandInterceptor拦截生成的SQL语句

开始

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

view sourceprint?

01.class EFIntercepterLogging : DbCommandInterceptor

02.{

03.private readonly Stopwatch _stopwatch = new Stopwatch();

04.public override void ScalarExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)

05.{

06.base.ScalarExecuting(command, interceptionContext);

07._stopwatch.Restart();

08.}

09.public override void ScalarExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<object> interceptionContext)

10.{

11._stopwatch.Stop();

12.if (interceptionContext.Exception != null)

13.{

14.Trace.TraceError("Exception:{1} \r\n --> Error executing command: {0}", command.CommandText, interceptionContext.Exception.ToString());

15.}

16.else

17.{

18.Trace.TraceInformation("\r\n执行时间:{0} 毫秒\r\n-->ScalarExecuted.Command:{1}\r\n", _stopwatch.ElapsedMilliseconds, command.CommandText);

19.}

20.base.ScalarExecuted(command, interceptionContext);

21.}

22.public override void NonQueryExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)

23.{

24.base.NonQueryExecuting(command, interceptionContext);

25._stopwatch.Restart();

26.}

27.public override void NonQueryExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<int> interceptionContext)

28.{

29._stopwatch.Stop();

30.if (interceptionContext.Exception != null)

31.{

32.Trace.TraceError("Exception:{1} \r\n --> Error executing command:\r\n {0}", command.CommandText, interceptionContext.Exception.ToString());

33.}

34.else

35.{

36.Trace.TraceInformation("\r\n执行时间:{0} 毫秒\r\n-->NonQueryExecuted.Command:\r\n{1}", _stopwatch.ElapsedMilliseconds, command.CommandText);

37.}

38.base.NonQueryExecuted(command, interceptionContext);

39.}

40.public override void ReaderExecuting(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)

41.{

42.base.ReaderExecuting(command, interceptionContext);

43._stopwatch.Restart();

44.}

45.public override void ReaderExecuted(System.Data.Common.DbCommand command, DbCommandInterceptionContext<System.Data.Common.DbDataReader> interceptionContext)

46.{

47._stopwatch.Stop();

48.if (interceptionContext.Exception != null)

49.{

50.Trace.TraceError("Exception:{1} \r\n --> Error executing command:\r\n {0}", command.CommandText, interceptionContext.Exception.ToString());

51.}

52.else

53.{

54.Trace.TraceInformation("\r\n执行时间:{0} 毫秒 \r\n -->ReaderExecuted.Command:\r\n{1}", _stopwatch.ElapsedMilliseconds, command.CommandText);

55.}

56.base.ReaderExecuted(command, interceptionContext);

57.}

58.}

上面这段代码需要命名空间:

using System.Data.Entity.Infrastructure.Interception;
using System.Diagnostics;

从方法名我们可以看出大致就三类:读取类的sql,[Reader],非读取类的sql,[NonQuery],还有[Scalar],这类用的比较少,跟原始的ADO.NET命令类型基本一样,不多讲.每个sql语句类型的方法都有执行前Executing,执行后Executed,从命名上我们就可以看出AOP的身影哈,接下来看如何使用它...

嗯,对没错,就是这么简单,当然你还可以把红线里那句代码放在Global文件里.

我们看看运行效果



个人感觉是比用什么插件,第三方类库,SqlProfile什么的方便点点,用博客园的Google搜索了一下,貌似没发现其他园友写这个方法,可能是太简单了,都不愿意写,还是麻烦推荐一下让更多的园友看到!

时间: 2024-10-24 09:47:11

使用EntityFramework6.1的DbCommandInterceptor拦截生成的SQL语句的相关文章

【分享】通过Excel生成批量SQL语句,处理大量数据的好办法

我们经常会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert into来实现,但是如果有几十条几百条甚至上千条数据的时候继续写单独的SQL语句的话那就惨了,其实有两种简单的方法: 第一,将Excel数据整理好了之后,通过SQL的导入功能直接导进数据库,但是得保证数据库字段和Excel的字段一致. 第二,通过Excel来生成对应的SQL语句,直接将SQL语句复制到分析器

oracle问题:新建了一个PDM文件,建表后生成的sql语句中含有clustered

问题描述 为了在oracle中新增表,在PDM中建表,使用其生成的sql语句,但是建表不能成功,提示 ORA-00906: 缺失左括号 原因是多了clustered 关键字 情景重现 1. 新建一个pdm文件 2. 建表后预览sql 是有clustered 这个关键字的 3. 建表时报错 问题解决 调查发现数据库的问题,右键数据库属性 查看DBMS 发现是 SQL SERVER ! 解决办法就是切换DBMS: 点击确定 再次查看sql语句,一切正常.问题最终解决.

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

在EF中,使用linq进行分页是很方便的,假如我们有一个EMP表,结构如下: public class Emp { [Key] public Guid No { get; set; } public int Age { get; set; } [Required] [StringLength(50)] public string Name { get; set; } } 如果我们进行分页的话,一般使用Skip和Take方法,这里一行最简单的代码如下: mContext.Emp.OrderBy(e

Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic-update 这两个注解在一定程度上可以增加与数据库操作相关的速度,可以节省SQL语句的执行时间,提高程序的运行效率. 使用这两个注解只需要在实体类上加入即可,或者在*.hbm.xml配置.这两个注解是boolean值,true或者false. 1.首先使用false来看一下执行的结果,我们就拿更新

COMMENT方法 用于在生成的SQL语句中添加注释内容,

COMMENT方法 用于在生成的SQL语句中添加注释内容,例如: $this->comment('查询考试前十名分数') ->field('username,score') ->limit(10) ->order('score desc') ->select(); 复制代码 大理石平台知识 最终生成的SQL语句是: SELECT username,score FROM think_score ORDER BY score desc LIMIT 10 /* 查询考试前十名分数

[NHibernate]查看NHibernate生成的SQL语句

最近接触到一个用Spring.Net结合NHIbernate的项目,第一次使用,有很多配置,数据操作一旦出问题,很难找到原因,那么如何查看NHibernate发送给数据库的SQL语句呢? 当然我们可以通过log4net记录日志来查看,但稍微有些繁琐,于是找到了另一种方法来查看. NHIbernate中的IInterceptor接口中定义的OnPrepareStatement(SqlString sql)可以观察到生成的sql,由EmptyInterceptor来实现. [Serializable

[转]Excel生成批量SQL语句,处理大量数据的好办法

当有大量重复体力工作写入或修改数据到数据库中时,可以 第一,将Excel数据整理好了之后,通过SQL的导入功能直接导进数据库,但是得保证数据库字段和Excel的字段一致. 第二,通过Excel来生成对应的SQL语句,直接将SQL语句复制到分析器里面执行即可. 如:使用excel的公式写入数据库: =“insert into [student] (userid,username,userpassword) values('"&A2&"','"&B2&am

C# 查看EF生成的SQL语句

用sqlsever追踪最后的sql语句. 返回IQueryable<T>类型, 里面封装的就是生成的SQL脚本,设置断点queryable = DataContext.Set<T>().Where<T>(whereLambda).AsQueryable(); queryable 右键快速监视, 或者ToString()返回字符串类型直接打印输出都能看到sql脚本. 打开SQLServer - 工具 - SQL Server Profiler 上查看执行的SQL语句. 原

EF生成的SQL语句执行顺序问题。

//实体被更改后,再做删除,EF只生成删除语句 //实体删除后再更改,EF报错 //添加语句会再,更改,删除后执行,更AddObject位置无关 //一个实体多个字段被改,只会生成一句update //多个表的update语句,会按表名顺序先后执行 //两个SaveChanges同时涉及多张表时,不会因为写入顺序(都是排序后的)不同而产生死锁 //update 多个update之间按表名来 --> delete(顺序同上 )->insert(顺序同上) //需要避免与ctx.ExecuteSt