让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

+

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

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

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

+

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

+

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

一切搞定之后,重新编译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

时间: 2024-10-08 00:08:18

让MySoft.Data也能有Discuz!NT的数据库查询分析工具的相关文章

Discuz!NT 3.5.2正式版与Asp.net网站会员信息整合

Discuz!NT 提供了很多对外的接口利于与别的网站进行整合,经本人亲测,觉得开放的接口还是挺到位的.开发.测试一次通过,只不过api文档寻找无门,只能自己琢磨,费了不少周折,不过,功夫不负有心人,最终还是搞定了. 第一步.Discuz!NT 的安装,不再描述了,网上的安装教程多的是.注意安装目录,如果是根目录,直接默认即可.如果是某一个文件夹下,如/bbs/等,在安装前可将BBS文件的根目录的DNT.config文件做相应修改,如下面代码. <?xml version="1.0&quo

Discuz!NT中的Redis架构设计

在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案,我在企业版里引入了Redis这个目前炙手可热的缓存架构产品,即将memcached与Redis作为可选插件方式来提供了最终用户,尽管目前测试的结果两者的差异不是很大(毫秒级),但我想多一种选择对用户来说也是好的. 闲话不多说了,开始今天的正文吧.         熟悉我们产品的开发者都知道,我们的

Discuz!NT静态文件缓存(SQUID)

在目前最新版本的产品中,我们提供了缓存静态文件的解决方案,就是使用SQUID做静态前端,将论坛中的大部分静态文件布署或外链到一个新的HTTP链接上,其中可以外链的静态文件包括: 1.Discuz.web/Javascript/ 下所有以‘template_’打头的JS文件以及该文件夹下的部分js文件.     2.模版文件夹下的所有CSS或IMAGE文件(空间相册文件夹除外)     3.前台Image文件夹下的Medal(勋章),Topicidentify(主题鉴定图标)下的所有文件. 同时在

从Discuz!NT项目文件结构看如何给系统框架分层和类库分文件夹

以下为Discuz!NT的文件夹根目录: 类库图: 从上面两个图可以看出: 1.dnt对于类库的分层是通过名称的层级来区分的,如Discuz.Plugn和Discuz.Plugin.Spread 2.在文件夹的分层上也是遵循第1种形式(除了Admin项目,Admin项目使用了子站点的技术,所以是包含在Discuz.Web文件夹里面,参考:http://www.cnblogs.com/EasonJim/archive/2013/05/06/3062571.html). 从上面可以这样总结: 1.在

Discuz!NT Flash无法上传头像,点击上传后无任何反应

最近在对一个Discuz!NT论坛的老项目进行维护和二次开发,遇到了论坛无法上传头像的问题.在网上找了相当多的资料,发现解决的方法基本是无效的.虽然有的状况一样,但是没有解决方法,后来自己研究了下也总算是解决了这个问题. 首先说明下出现无法上传头像的具体症状,大概的症状有下面这几点: 使用Flash头像上传时,点击上传图片,然后显示“图片载入中,请稍后的提示信息”和上传进度的百分比,最后却是没有任何的反应. 网上有部分网友说到进度到10%就没有任何反应,其实只是部分情况,如果传大图片的话会显示其

MySoft.Data 2.7.3版本的GitHub托管(升级封装)

MySoft.Data 2.7.3 dotnet ORM 版权 这里版权属于老毛:http://www.cnblogs.com/maoyong 说明 MySoft体系中的ORM组件,这里的版本为2.7.3,在公司内部企业项目中历练了几年,修复了一些bug,所以直接在这里开源进行维护.但是要注意:组件的全部版权属于老毛.在这个组件的基础上,又封装了一层单例层,再配合这个单例层的代码生成器,能同时生成实体和针对这个实体的增删改查方法. 单组件的使用教程 参考老毛的使用教程:http://www.cn

(转)Discuz!NT图文安装教程

不同目录下的安装方法根据目前大家对论坛的使用需求,在安装上面大致有三种情况,站点根目录下安装,站点虚拟目录下安装和站点子目录下安装. 1.根目录安装 根目录安装是最简单也是稳定系数最高的安装和使用方式,为我们的推荐方式.论坛配置项不需要做任何调整,只需要将站点程序(安装包upload_files目录内的所有文件)上传至站点根目录下就可以运行install/index.aspx开始安装了. 2.虚拟目录安装 由于Discuz!NT拥有能大幅优化搜索引擎友好度的页面伪静态功能,所以如果论坛程序不是安

Discuz!NT中集成Memcached分布式缓存

大约在两年前我写过一篇关于Discuz!NT缓存架构的文章,在那篇文章的结尾介绍了在IIS中如果开启多个应用程序池会造成多个缓存实例之间数据同步的问题.虽然给出了一个解决方案,但无形中却把压力转移到了磁盘I/O上(多个进程并发访问cache.config文件).其实从那时起我就开始关注有什么更好的方案,当然今天本文中所说的Memcached,以及Velocity等这类的分布式缓存方案之前都考虑过,但一直未能决定该使用那个.起码Velocity要在.net 4.0之后才会提供,虽然是原生态,但有些

在Discuz!NT中进行缓存分层(本地缓存+memcached)(转)

在以前的两篇文章(Discuz!NT 缓存设计简析, Discuz!NT中集成Memcached分布式缓存)中,介绍了Discuz!NT中的缓存设计思路以及如何引入Memcached,当然前者是IIS进程的缓存(本地缓存),后者是分布式内存对象缓存系统. 两者通过Discuz!NT中的memcached.config文件中的ApplyMemCached结点的值来决定使用哪一种缓存方式.不过在之后,有朋友反映当使用Memcached时,特别是在大并发来时,效率会打折扣,甚至有很多时间会消耗在soc