你的位置:首页 > ASP.net教程

[ASP.net教程]让MySoft.Data也能有Discuz!NT的数据库查询分析工具


当我们用Debug模式运行Discuz!NT项目的时候,我们会发现在页面的最下方有一个数据查询分析工具,非常的方便。当我们运行一个页面的时候,对sql的操作可以一目了然。当然,有些还是无法显示在页面上的,比如多个跳转的时候,最终显示的就只有一个页面的sql。不过也挺方便了。

如图:

这个数据库查询分析工具,只有在Debug模式下才会显示,Release模式不会显示。

这样的做法有两个好处,一是方便调试,第二是每当发布站点的时候,一定是Release模式的,可以确保站点在运行效率上有保证(很多时候我都是Debug的,囧)。

到底Disucuz!NT是怎么做的,从页面上分析可以知道,是直接在</body>的前面添加这些调试信息上去的

 

这些信息,在数据访问的DbHelper直接通过CommandText得到sql,DbParameter得到参数。当执行SQL时,通过DbHelper这个类里面的QueryDetail类进行html的拼装,最终成为这个样子了。在这里我就简单说下,不做详细的分析了,有兴趣的同学可以直接看Discuz!NT项目的pagebase类和dbhelper类,全部都是在这里实现的。

最关键的就是,这么好的一个功能怎么搬到MySoft.Data框架上去用,Discuz!NT每次输出HTML时是通过模板进行页面显示的,所以,在数据访问阶段得到的sql直接嵌进去就可以了。但是,我们这些普通的页面输出就不能按照这样的做法了。

经过测试,只有每当得到这些数据库分析的HTML时就在httpmodule类中得到即将输出的页面得到HTML再进行嵌进去,这里如果不嵌入到原有的html中,而是直接加到网页的最末尾,会导致页面的JS报错,css错位等。所以,必须把这些html加入到</body>标签的前面。

原理就是这样,具体看下面代码实现吧:

首先,在MySoft.Data的DbHelper类中进行代码的改装:DbHelper.cs

+ View Code



 在这个类中,加入了DEBUG的语句,目的是当调试的时候才运行代码,Relese的时候不会显示,这就是上面所说的只有Relese的版本不会显示调试信息的目的了。

其中GetQueryDetail这个类是直接返回HTML信息的,把SQL传入进去就会返回。

GetQueryDetail的具体实现在DbQueryDetailHelper这个类中:DbQueryDetailHelper.cs

+ View Code



 

得到HTML之后就是输出了,那么这个操作我就放在了DbQueryDetailHttpModule的类中,这是一个IHttpModule的类,目的是得到最后页面输出的HTML,把调试SQL信息嵌入到其中去:DbQueryDetailHttpModule.cs

 

+ View Code



 

 这里就不多说了,直接看代码吧,原理也是替换(这里我在网上找了很久,终于发现这样写可以,就直接用了,囧)。

一切搞定之后,重新编译MoSoft.Data类库,最后在Web.Config文件添加HttpModule配置节:

<add name="DbQueryDetailHttpModule" type="MySoft.Data.DbQueryDetailHttpModule,MySoft.Data"/>

就这样,整个功能就能全部实现了,最后看一下我们输出的页面:

 

这些显示,完全和原版的一模一样,所以,我成功了移植了这个功能。哈哈

需要注意的是,这个功能只能适合Web开发,不使用桌面应用的开发。

所以,我又进行再一次的改装,就是直接输入SQL信息到文件中,每一次的访问都记录在日志文件中,这样就能用于桌面的应用开发了,具体的实现也是在DbQueryDetailHelper类中(看前面的类)。

输入的格式如图:

到此为止,整个实现过程就是这样子。其实这里的实现方法,可以应用于其它的ORM,看个人的喜爱了。

最后附上单独的文件和改装后的MySoft.Data。

单独文件:xxx

针对MySoft.Data的替换方法:1、替换MySoft.Data\Data\Session\DbHelper.cs  2、在MySoft.Data\Common添加DbQueryDetail文件夹内容

改装后的MySoft.Data文件(2.7.5):xxx

使用方法:引入类库,在Web.Config添加HttpModules节:<add name="DbQueryDetailHttpModule" type="MySoft.Data.DbQueryDetailHttpModule,MySoft.Data"/>即可,注意一定要添加到最后面。

正版的MySoft.Data地址为:xxx

完整的示例项目:xxx