微软.NET技术实践 ORM开发系列文章汇总 智能提示的模板编辑器Template Studio 和 查询追踪器 LLBL Gen Profiler

这篇文章起源于我的LLBL Gen 3.x ORM源码追踪系列教程,有以下几篇文章

LLBL Gen 3.x 源代码追踪与解析 认识框架结构

LLBL Gen 3.x 源代码追踪与解析 Type Converter 类型转换器

LLBL Gen 3.x 源代码追踪与解析 存储过程的执行

LLBL Gen 3.x 源代码追踪与解析 查询命令的追踪

LLBL Gen 3.x 源代码追踪与解析 验证Validation的原理和流程

ERP/MIS开发 开发LLBL Gen 插件(Plun-in) Implementing a plug-in

很多朋友都疑惑,分析源代码有什么用呢,别人的代码是这样写的,我不可能写一个同样的软件,所以没有必要分析它的源代码。因为工作的关系,我猜想,大部分朋友,都不会依靠分析源代码来提高代码开发技术,这个过程太缓慢,不容易有效果,我们提升技术的最快方法一般是读文章,在实际应用的时候再多练习应用。

以下两个软件,是我通过使用,分析LLBL Gen 3.x的代码,体会出来的心得,也是.NET实践的内容。

Template Studio

LLBL Gen 3.x有自己的Template Studio,但是它不提供智能提示支持,这样写代码,效率不高,于是我想到做一个带智能提示的模板编辑器,请看下面的模板定义,LLBL Gen 3.x的lpt类型的模板定义

<%
Project currentProject = _executingGenerator.ProjectDefinition;
EntityDefinition currentEntity = (EntityDefinition)_activeObject;

%>
using System;
using System.Data;

如果你不熟悉,可以参考我的文章《Template Studio 模板开发入门 Lpt templates Development》,以帮助理解。

引用里面的讲解,_executingGenerator是Template Studio内置的变量,在运行时动态传入值,它的类型是IGenerator,定义于程序集SD.LLBLGen.Pro.GeneratorCore中。还有两个变量

_parameters, 类型是Dictionary(String, TaskParameter) ,存放当前task的参数

_activeObject, 如果emitType=allEntites,则它代表当前的实体对象。

所以,我要达到的效果是这样

image

当敲入_executingGenerator类型的变量时,可以显示它的成员列表,以方便快速的编辑模板。

如果你读过我的文章,《工作五年的.NET程序员再谈应用反射,动态编译,代码生成器》,它提到的模板语法如下

<%@ Property Name="Math" Type="MathProgram"  Category="Text"Description="Namespace for this class" %>
<%@ Property Name="IncludeDelete" Type="System.Int32" Default="123" Category="Options" Description="If true delete statements will be generated." %>

<%@ Assembly Name="TestClassLibrary" %>
<%@ Import Namespace="EPN.Common" %>

LLBL Gen 3.x的lpt模板文件定义和上面的Code Smith的模板定义有区别,所以,那篇文章中提到的技术,需要改良一下,才可以达到智能提示的目的。

 

LLBL Profile

这个软件,是用于跟踪LLBL Gen的动态输出的SQL语句,并且把它转化成可直接运行的SQL语句。LLBL Gen 的Trace输出的SQL不是标准的SQL,需要适当的转换一下才能运行。请看下图
clip_image011_thumb1

通过Socket技术,把追踪到的SQL,输出到指定的服务器窗口中,然后在自动转化为窗体下方的可运行的SQL语句,这是它的主要功能。
ORM追踪的难题之一是ORM框架会生成动态SQL语句,可以直接运行,但是修改起来很麻烦。
请看下面的动态SQL语句的例子

EXECUTE (N'SELECT * FROM Groups')  
SP_EXECUTESQL N'SELECT * FROM Groups'
提到动态SQL语句,这句话可能很重要:EXECUTE 括号里面只能是字符串变量、字符串常量、或它们的连接组合,不能调用其它一些函数、存储过程等。 如果要使用,则使用变量组合。
什么时候用动态SQL语句,当SQL的结构不能确定(即表名和列名),用动态SQL。

LLBL Profile把ORM动态生成的SQL语句,转化成静态的SQL语句,可用来修改,这是它的主要功能点。

我在追踪程序的结果或SQL的结果有区别时,经常用这个办法,来找到问题所在。

在我写过这个软件之后,又到互联网上搜索了一下,发现有个叫LLBL Gen Profile的商业软件,做的很不错。

image

商业的软件,肯定会有界面友好,易用性,稳定性上面下功夫。和它比起来,我的软件简直就是丑小鸭,我想要是能多坚持一段时间的开发,肯定可以做得再好一些。

如果要了解更多的关于ORM追踪的内容,请参考文章《信息化基础建设 开发框架》中的SQL Profiler 跟踪查询小节。

posted @ 2011-09-09 15:07  信息化建设  阅读(2247)  评论(2编辑  收藏  举报