代码生成器是提高生产力的工具,目前的代码生成器太多了,CodeSmith,MyGeneration,动软,应该是目前用的比较多的几个代码生成器,但是东西往往不尽人意,复杂的东西太麻烦,简单的又不灵活,我现在像大家介绍一个简单而有强大的代码生成方法,简单的你无法想象,我前段时间也在写代码生成器,发现有几种方法可以实现代码生成器,一种是用字符串直接连接起来,这个可太难看,而且应该要修改也不方便,还有就是模板生成,用模板来生成,这个好.简单有灵活,我现在介绍另一种方法就是xml+xslt来生成代码,这个相当强大,只需要2个文件就可以搞定你的代码生成器,一个xml文件,还有就是一个xslt文件,xml文件大家都知道是什么,我就不用介绍了,xslt就是xml的样式文件,大家应该看过很多.xml结尾的网站,这些网站需要输出网页的风格就需要xslt来格式化,否则只能看到一个xml文档,下面我们开始吧.
第一点我们需要一个xml文件,这个xml你可以用c#来生成大致的结构是如下
< Root >
< Table >
<!-- 名称空间 -->
< NameSpace > NameSpace </ NameSpace >
<!-- 类名 -->
< ClassName > ClassName </ ClassName >
<!-- 表名 -->
< TableName > TableName </ TableName >
<!-- 时间 -->
< DateTime > DateTime </ DateTime >
<!-- 主键 -->
< PrimaryKey >
< FieldName >
< Field > Field </ Field >
< Key > true </ Key >
< Identity > true </ Identity >
< DataType > int </ DataType >
< DbType > Int </ DbType >
< Length > 4 </ Length >
< isNull > false </ isNull >
< DefualtValue ></ DefualtValue >
< ColumnDescription > 员工ID </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > Field1 </ Field >
< Key > true </ Key >
< Identity > true </ Identity >
< DataType > int </ DataType >
< DbType > Int </ DbType >
< Length > 4 </ Length >
< isNull > false </ isNull >
< DefualtValue ></ DefualtValue >
< ColumnDescription > 员工ID </ ColumnDescription >
</ FieldName >
</ PrimaryKey >
<!-- 自动增长 -->
< Identity >
< FieldName >
< Field > Field </ Field >
< Key > false </ Key >
< Identity > true </ Identity >
< DataType > int </ DataType >
< DbType > Int </ DbType >
< Length > 4 </ Length >
< isNull > false </ isNull >
< DefualtValue ></ DefualtValue >
< ColumnDescription > 员工ID </ ColumnDescription >
</ FieldName >
</ Identity >
<!-- 字段详细内容 -->
< DataField >
< FieldName >
< Field > EmployeeID </ Field >
< Key > true </ Key >
< Identity > true </ Identity >
< DataType > int </ DataType >
< DbType > Int </ DbType >
< Length > 4 </ Length >
< isNull > false </ isNull >
< DefualtValue ></ DefualtValue >
< ColumnDescription > 员工ID </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > LastName </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 20 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 名称ID </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > FirstName </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 10 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 姓 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > BirthDate </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > DateTime </ DataType >
< DbType > DateTime </ DbType >
< Length ></ Length >
< isNull > false </ isNull >
< DefualtValue > getdate() </ DefualtValue >
< ColumnDescription > 生日 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > Sex </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 1 </ Length >
< isNull > true </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 性别 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > Address </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 200 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 地址 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > Company </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 100 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 公司 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > Age </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > int </ DataType >
< DbType > int </ DbType >
< Length > 4 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 年龄 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > Phone </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 30 </ Length >
< isNull > true </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 电话 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > Mobile </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 20 </ Length >
< isNull > true </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 手机 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > UserId </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > int </ DataType >
< DbType > Int </ DbType >
< Length > 10 </ Length >
< isNull > false </ isNull >
< DefualtValue > 用户ID </ DefualtValue >
< ColumnDescription ></ ColumnDescription >
</ FieldName >
< FieldName >
< Field > FirstName </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 10 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 姓 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > FirstName </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 10 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 姓 </ ColumnDescription >
</ FieldName >
< FieldName >
< Field > FirstName </ Field >
< Key > false </ Key >
< Identity > false </ Identity >
< DataType > string </ DataType >
< DbType > NvarChar </ DbType >
< Length > 10 </ Length >
< isNull > false </ isNull >
< DefualtValue > "" </ DefualtValue >
< ColumnDescription > 姓 </ ColumnDescription >
</ FieldName >
</ DataField >
</ Table >
</ Root >
这个是我的格式的xml文件,当你可以生成一个自己想要个别的xml文件,比如通过一个sql语句来查询数据库把,表结构,和字段信息,查出来,然后生成一个这样子的xml文件就可以
最重要的是xlst文件.这个才是最重要的东西.这个xml就是数据文件.
下面我们要的就是模板文件了.其实这个模板文件就是一个xslt的文件.用他来格式化xml,让以一定风格来输出这个xml
我们先用上面的xml文件来生成对表的添加,删除,修改,获取实体的sql语句操作
< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl ="urn:schemas-microsoft-com:xslt" exclude-result-prefixes ="msxsl"
>
< xsl:output method ="xml" indent ="yes" />
< xsl:template match ="/" >
create proc < xsl:value-of select ="Root/Table/TableName" /> _Add
-- < xsl:value-of select ="Root/Table/DateTime" /> --
< xsl:call-template name ="DefinitionAddParameters" />
as
insert into < xsl:value-of select ="Root/Table/TableName" />
( < xsl:call-template name ="GetAddField" /> )
values
( < xsl:call-template name ="GetAddParameters" />
< xsl:call-template name ="IdentityOutput" />
go
create proc < xsl:value-of select ="Root/Table/TableName" /> _Update
-- < xsl:value-of select ="Root/Table/DateTime" /> --
< xsl:call-template name ="DefinitionUpdateParameters" />
as
update < xsl:value-of select ="Root/Table/TableName" /> set
< xsl:call-template name ="GetUpdateField" />
< xsl:call-template name ="GetUpdateWhere" />
go
create proc < xsl:value-of select ="Root/Table/TableName" /> _Delete
-- < xsl:value-of select ="Root/Table/DateTime" /> --
< xsl:call-template name ="DefinitionDeleteParameters" />
as
delete from < xsl:value-of select ="Root/Table/TableName" />
< xsl:call-template name ="GetDeleteWhere" />
go
create proc < xsl:value-of select ="Root/Table/TableName" /> _GetModel
-- < xsl:value-of select ="Root/Table/DateTime" /> --
< xsl:call-template name ="DefinitionDeleteParameters" />
as
select < xsl:call-template name ="GetAddField" />
from < xsl:value-of select ="Root/Table/TableName" />< xsl:text > </ xsl:text >< xsl:call-template name ="GetModelWhere" />
</ xsl:template >
< xsl:template name ="IdentityOutput" >
< xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
< xsl:if test ="position()!=last()" >
set @ < xsl:value-of select ="Field" /> = scope_identity()
</ xsl:if >
< xsl:if test ="position()=last()" >
set @ < xsl:value-of select ="Field" /> = scope_identity()
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 定义参数 -->
< xsl:template name ="DefinitionAddParameters" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="Key='true'" >
< xsl:if test ="position()!=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > output, < xsl:if test ="ColumnDescription!=''" > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
< xsl:if test ="position()=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > output < xsl:if test ="ColumnDescription!=''" > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
</ xsl:if >
< xsl:if test ="Key='false'" >
< xsl:if test ="position()!=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" /> < xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > , < xsl:if test ="ColumnDescription!=''" >< xsl:text > </ xsl:text > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
< xsl:if test ="position()=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" /> < xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > < xsl:if test ="ColumnDescription!=''" >< xsl:text > </ xsl:text > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 生成AddSQL -->
< xsl:template name ="GetAddField" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="position() mod 8 != 0" >
< xsl:if test ="position()!=last()" >
< xsl:value-of select ="Field" />< xsl:text > </ xsl:text > , </ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" />
< xsl:text > </ xsl:text >
</ xsl:if >
</ xsl:if >
< xsl:if test ="position() mod 8 = 0" >
< xsl:if test ="position()!=last()" >
< xsl:value-of select ="Field" />
< xsl:text > </ xsl:text > ,
</ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" />
< xsl:text > </ xsl:text >
</ xsl:if >
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 生成AddSQL -->
< xsl:template name ="GetAddParameters" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="Identity!='true'" >
< xsl:if test ="position() mod 8 != 0" >
< xsl:if test ="position()!=last()" > @ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text > , </ xsl:if >
< xsl:if test ="position()=last()" > @ < xsl:value-of select ="Field" />
< xsl:text > </ xsl:text > )
</ xsl:if >
</ xsl:if >
< xsl:if test ="position() mod 8 = 0" >
< xsl:if test ="position()!=last()" > @ < xsl:value-of select ="Field" />
< xsl:text > </ xsl:text > ,
</ xsl:if >
< xsl:if test ="position()=last()" > @ < xsl:value-of select ="Field" />
< xsl:text > </ xsl:text > )
</ xsl:if >
</ xsl:if >
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 定义Update参数 -->
< xsl:template name ="DefinitionUpdateParameters" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="Key='true'" >
< xsl:if test ="position()!=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > output, < xsl:if test ="ColumnDescription!=''" > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
< xsl:if test ="position()=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > output < xsl:if test ="ColumnDescription!=''" > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
</ xsl:if >
< xsl:if test ="Key='false'" >
< xsl:if test ="position()!=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" /> < xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > , < xsl:if test ="ColumnDescription!=''" >< xsl:text > </ xsl:text > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
< xsl:if test ="position()=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" /> < xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > < xsl:if test ="ColumnDescription!=''" >< xsl:text > </ xsl:text > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 生成UpdateSQL -->
< xsl:template name ="GetUpdateField" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="Identity!='true'" >
< xsl:if test ="position() mod 4 != 0" >
< xsl:if test ="position()!=last()" >
< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" /> , </ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" />
< xsl:text > </ xsl:text >
</ xsl:if >
</ xsl:if >
< xsl:if test ="position() mod 4 = 0" >
< xsl:if test ="position()!=last()" >
< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" />
< xsl:text > </ xsl:text > ,
</ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" />
< xsl:text > </ xsl:text >
</ xsl:if >
</ xsl:if >
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 生成Update条件 -->
< xsl:template name ="GetUpdateWhere" >
where < xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
< xsl:if test ="position()!=last()" >< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" /> , </ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" />
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 生成Update条件 -->
< xsl:template name ="DefinitionDeleteParameters" >
< xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
< xsl:if test ="position()!=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > , < xsl:if test ="ColumnDescription!=''" > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
< xsl:if test ="position()=last()" >
@ < xsl:value-of select ="Field" />< xsl:text > </ xsl:text >< xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > ( < xsl:value-of select ="Length" /> ) </ xsl:if > < xsl:if test ="ColumnDescription!=''" >< xsl:text > </ xsl:text > -- < xsl:value-of select ="ColumnDescription" /></ xsl:if >
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 生成Delete条件 -->
< xsl:template name ="GetDeleteWhere" >
where < xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
< xsl:if test ="position()!=last()" >< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" /> , </ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" />
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 生成getmodel条件 -->
< xsl:template name ="GetModelWhere" > where < xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
< xsl:if test ="position()!=last()" >< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" /> , </ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" /> = @ < xsl:value-of select ="Field" />
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
</ xsl:stylesheet >
这个就是一个xslt文件,注意他也有自己的语法,不过超级简单,大家可以学习下,真的太简单了.
http://www.w3school.com.cn/xml/xml_xsl.asp 大家可以去这里学习一下xslt语法.这个真是个好东西,如果你看了.我这片文章,你还不知道有xslt这个东西,那真的我只能说你真是太让人失望了,呵呵...
xslt的语法不是我要重要介绍的.我要介绍的是代码生成器,当然如果你需要生成不同的代码,只需要需该我上面生成的xslt文件就可以做到.
xslt格式化xml有很多种方法,比如js,或者.net,都可以很简单的来实现.下面我用vs2008来生成这个代码来看看
用vs2008打开这2个文件,或者直接拖到vs2008 里面编辑
选择vs的工具条中的 显示xlst输出 ,然后选择这个xml文件,就会输出你要的存储过程了.
create proc TableName_Add
-- DateTime--
@EmployeeID Int ( 4 ) output, -- 员工ID
@LastName NvarChar ( 20 ), -- 名称ID
@FirstName NvarChar ( 10 ), -- 姓
@BirthDate DateTime , -- 生日
@Sex NvarChar ( 1 ), -- 性别
@Address NvarChar ( 200 ), -- 地址
@Company NvarChar ( 100 ), -- 公司
@Age int ( 4 ), -- 年龄
@Phone NvarChar ( 30 ), -- 电话
@Mobile NvarChar ( 20 ), -- 手机
@UserId Int ( 10 ),
@FirstName NvarChar ( 10 ), -- 姓
@FirstName NvarChar ( 10 ), -- 姓
@FirstName NvarChar ( 10 ) -- 姓
as
insert into TableName
( EmployeeID , LastName , FirstName , BirthDate , Sex , Address , Company , Age ,
Phone , Mobile , UserId , FirstName , FirstName , FirstName )
values
( @LastName , @FirstName , @BirthDate , @Sex , @Address , @Company , @Age ,
@Phone , @Mobile , @UserId , @FirstName , @FirstName , @FirstName )
set @Field = scope_identity ()
set @Field1 = scope_identity ()
go
create proc TableName_Update
-- DateTime--
@EmployeeID Int ( 4 ) output, -- 员工ID
@LastName NvarChar ( 20 ), -- 名称ID
@FirstName NvarChar ( 10 ), -- 姓
@BirthDate DateTime , -- 生日
@Sex NvarChar ( 1 ), -- 性别
@Address NvarChar ( 200 ), -- 地址
@Company NvarChar ( 100 ), -- 公司
@Age int ( 4 ), -- 年龄
@Phone NvarChar ( 30 ), -- 电话
@Mobile NvarChar ( 20 ), -- 手机
@UserId Int ( 10 ),
@FirstName NvarChar ( 10 ), -- 姓
@FirstName NvarChar ( 10 ), -- 姓
@FirstName NvarChar ( 10 ) -- 姓
as
update TableName set
LastName = @LastName , FirstName = @FirstName , BirthDate = @BirthDate ,
Sex = @Sex , Address = @Address , Company = @Company , Age = @Age ,
Phone = @Phone , Mobile = @Mobile , UserId = @UserId , FirstName = @FirstName ,
FirstName = @FirstName , FirstName = @FirstName
where Field = @Field , Field1 = @Field1
go
create proc TableName_Delete
-- DateTime--
@Field Int ( 4 ), -- 员工ID
@Field1 Int ( 4 ) -- 员工ID
as
delete from TableName
where Field = @Field , Field1 = @Field1
go
create proc TableName_GetModel
-- DateTime--
@Field Int ( 4 ), -- 员工ID
@Field1 Int ( 4 ) -- 员工ID
as
select EmployeeID , LastName , FirstName , BirthDate , Sex , Address , Company , Age ,
Phone , Mobile , UserId , FirstName , FirstName , FirstName
from TableName where Field = @Field , Field1 = @Field1
xslt相当灵活,可以说你要什么效果都可以实现,只要你写一个xslt文件这么简单,也就是我们说的模板文件
我们再生成一下dal的代码
当然要一个dal.xslt的文件
< xsl:stylesheet version ="1.0" xmlns:xsl ="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl ="urn:schemas-microsoft-com:xslt" exclude-result-prefixes ="msxsl"
xmlns:user ="UserCode" >
< xsl:output method ="xml" indent ="yes" />
< xsl:template match ="/" >
/// < xsl:value-of select ="Root/Table/DateTime" />
using System;
using System.Data;
using System.Data.SqlClient;
< xsl:choose >< xsl:when test ="Root/Table/NameSpace!=''" > using < xsl:value-of select ="Root/Table/NameSpace" /> .Model; </ xsl:when >< xsl:otherwise > using Model;
</ xsl:otherwise >
</ xsl:choose >
< xsl:call-template name ="GetNameSpace" />
public class < xsl:value-of select ="Root/Table/ClassName" />
{
/// < xsl:text disable-output-escaping ="yes" > < summary > </ xsl:text >
/// 添加
/// < xsl:text disable-output-escaping ="yes" > < /summary > </ xsl:text >
public bool Add( < xsl:call-template name ="GetName" /> model)
{
SqlParameter[] parameters ={ < xsl:call-template name ="GetField" />
< xsl:text > </ xsl:text >
< xsl:text > </ xsl:text >< xsl:call-template name ="Add-SetField" />
if(SQLHelper.RunQuery(" < xsl:value-of select ="Root/Table/ClassName" /> _Add", parameters))
{ < xsl:call-template name ="Add-SetReturn" />
return true;
}
else
{
return false;
}
}
/// < xsl:text disable-output-escaping ="yes" > < summary > </ xsl:text >
/// 更新记录
/// < xsl:text disable-output-escaping ="yes" > < /summary > </ xsl:text >
public bool Update( < xsl:call-template name ="GetName" /> model)
{
SqlParameter[] parameters ={ < xsl:call-template name ="GetField" />
< xsl:text > </ xsl:text >
< xsl:text > </ xsl:text >< xsl:call-template name ="Update-SetField" />
if(SQLHelper.RunQuery(" < xsl:value-of select ="Root/Table/ClassName" /> _Update", parameters))
{
return true;
}
else
{
return false;
}
}
/// < xsl:text disable-output-escaping ="yes" > < summary > </ xsl:text >
/// 删除
/// < xsl:text disable-output-escaping ="yes" > < /summary > </ xsl:text >
public bool Delete( < xsl:call-template name ="GetKeyField" /> )
{
SqlParameter[] parameters ={ < xsl:call-template name ="Delete-GetField" />
< xsl:call-template name ="Delete-SetField" />
if(SQLHelper.RunQuery(" < xsl:value-of select ="Root/Table/ClassName" /> _Delete", parameters))
{
return true;
}
else
{
return false;
}
}
/// < xsl:text disable-output-escaping ="yes" > < summary > </ xsl:text >
/// 获取实体
/// < xsl:text disable-output-escaping ="yes" > < /summary > </ xsl:text >
public < xsl:call-template name ="GetName" /> GetModel( < xsl:call-template name ="GetKeyField" /> )
{
SqlParameter[] parameters ={ < xsl:call-template name ="Delete-GetField" />
< xsl:call-template name ="Delete-SetField" />
< xsl:text > </ xsl:text > < xsl:text > </ xsl:text >
< xsl:text > </ xsl:text >< xsl:call-template name ="GetName" /> model= new < xsl:call-template name ="GetName" /> ();
DataTable dt = SQLHelper.QueryTable(" < xsl:value-of select ="Root/Table/ClassName" /> _GetModel", parameters);
if (dt.Rows.Count < xsl:text disable-output-escaping ="yes" > > </ xsl:text > 0)
{ < xsl:call-template name ="GetModel" />
}
else
{
model = null;
}
dt.Clear();
dt.Dispose();
return model;
}
}
}
</ xsl:template >
<!-- 获取类 -->
< xsl:template name ="GetName" >
< xsl:choose >
< xsl:when test ="Root/Table/NameSpace!=''" >< xsl:value-of select ="Root/Table/NameSpace" /> .Model. < xsl:value-of select ="Root/Table/ClassName" /></ xsl:when >
< xsl:otherwise > Model. < xsl:value-of select ="Root/Table/ClassName" />
</ xsl:otherwise >
</ xsl:choose >
</ xsl:template >
<!-- 获取名称空间 -->
< xsl:template name ="GetNameSpace" >
< xsl:choose >
< xsl:when test ="Root/Table/NameSpace!=''" >
namespace < xsl:value-of select ="Root/Table/NameSpace" /> .DAL
{
</ xsl:when >
< xsl:otherwise >
namespace DAL
{
</ xsl:otherwise >
</ xsl:choose >
</ xsl:template >
<!-- 获取主键 -->
< xsl:template name ="GetKeyField" >
< xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
< xsl:value-of select ="DataType" />
< xsl:text > </ xsl:text >
< xsl:if test ="position()!=last()" >
< xsl:value-of select ="Field" /> , < xsl:text > </ xsl:text >
</ xsl:if >
< xsl:if test ="position()=last()" >
< xsl:value-of select ="Field" />
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- 获取字段声明 -->
< xsl:template name ="GetField" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="position()!=last()" >
new SqlParameter("@ < xsl:value-of select ="Field" /> ",SqlDbType. < xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > , < xsl:value-of select ="Length" /></ xsl:if > ), </ xsl:if >
< xsl:if test ="position()=last()" >
new SqlParameter("@ < xsl:value-of select ="Field" /> ",SqlDbType. < xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > , < xsl:value-of select ="Length" />
</ xsl:if > )}; </ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- (添加)字段赋值 -->
< xsl:template name ="Add-SetField" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="Key='true'" >
< xsl:text > </ xsl:text > parameters[ < xsl:value-of select ="position()-1" /> ].Value = ParameterDirection.Output;
</ xsl:if >
< xsl:if test ="Key='false'" >
< xsl:text > </ xsl:text > parameters[ < xsl:value-of select ="position()-1" /> ].Value = model. < xsl:value-of select ="Field" /> ;
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- (更新)字段赋值 -->
< xsl:template name ="Update-SetField" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:text > </ xsl:text > parameters[ < xsl:value-of select ="position()-1" /> ].Value = model. < xsl:value-of select ="Field" /> ;
</ xsl:for-each >
</ xsl:template >
<!-- (添加)设置返回值 -->
< xsl:template name ="Add-SetReturn" >
< xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
model. < xsl:value-of select ="Field" /> = ( < xsl:value-of select ="DataType" /> )parameters[ < xsl:value-of select ="position()-1" /> ].Value; </ xsl:for-each >
</ xsl:template >
<!-- (删除)获取字段声明 -->
< xsl:template name ="Delete-GetField" >
< xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
< xsl:if test ="position()!=last()" >
new SqlParameter("@ < xsl:value-of select ="Field" /> ",SqlDbType. < xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > , < xsl:value-of select ="Length" />
</ xsl:if > ), </ xsl:if >
< xsl:if test ="position()=last()" >
new SqlParameter("@ < xsl:value-of select ="Field" /> ",SqlDbType. < xsl:value-of select ="DbType" />< xsl:if test ="Length!=''" > , < xsl:value-of select ="Length" />
</ xsl:if > )};
</ xsl:if >
</ xsl:for-each >
</ xsl:template >
<!-- (删除)字段赋值 -->
< xsl:template name ="Delete-SetField" >
< xsl:for-each select ="Root/Table/PrimaryKey/FieldName" >
parameters[ < xsl:value-of select ="position()-1" /> ].Value = < xsl:value-of select ="Field" /> ; </ xsl:for-each >
</ xsl:template >
<!-- 返回实体 -->
< xsl:template name ="GetModel" >
< xsl:for-each select ="Root/Table/DataField/FieldName" >
< xsl:if test ="DataType='string'" >
model. < xsl:value-of select ="Field" /> = dt.Rows[0][" < xsl:value-of select ="Field" /> "].ToString(); </ xsl:if >
< xsl:if test ="DataType!='string'" >
if (dt.Rows[0][" < xsl:value-of select ="Field" /> "].ToString() != "")
{
model. < xsl:value-of select ="Field" /> = int.Parse(dt.Rows[0][" < xsl:value-of select ="Field" /> "].ToString());
} </ xsl:if >
</ xsl:for-each >
</ xsl:template >
</ xsl:stylesheet >
重复上面同样的工作就可以生成出dal的代码了..
选择一个xml文件,我们还是选择上面的xml.然后输出的结果如下
/// DateTime
using System;
using System.Data;
using System.Data.SqlClient;
using NameSpace.Model;
namespace NameSpace.DAL
{
public class ClassName
{
/// <summary>
/// 添加
/// </summary>
public bool Add(NameSpace.Model.ClassName model)
{
SqlParameter[] parameters = {
new SqlParameter( " @EmployeeID " ,SqlDbType.Int, 4 ),
new SqlParameter( " @LastName " ,SqlDbType.NvarChar, 20 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 ),
new SqlParameter( " @BirthDate " ,SqlDbType.DateTime),
new SqlParameter( " @Sex " ,SqlDbType.NvarChar, 1 ),
new SqlParameter( " @Address " ,SqlDbType.NvarChar, 200 ),
new SqlParameter( " @Company " ,SqlDbType.NvarChar, 100 ),
new SqlParameter( " @Age " ,SqlDbType. int , 4 ),
new SqlParameter( " @Phone " ,SqlDbType.NvarChar, 30 ),
new SqlParameter( " @Mobile " ,SqlDbType.NvarChar, 20 ),
new SqlParameter( " @UserId " ,SqlDbType.Int, 10 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 )};
parameters[ 0 ].Value = ParameterDirection.Output;
parameters[ 1 ].Value = model.LastName;
parameters[ 2 ].Value = model.FirstName;
parameters[ 3 ].Value = model.BirthDate;
parameters[ 4 ].Value = model.Sex;
parameters[ 5 ].Value = model.Address;
parameters[ 6 ].Value = model.Company;
parameters[ 7 ].Value = model.Age;
parameters[ 8 ].Value = model.Phone;
parameters[ 9 ].Value = model.Mobile;
parameters[ 10 ].Value = model.UserId;
parameters[ 11 ].Value = model.FirstName;
parameters[ 12 ].Value = model.FirstName;
parameters[ 13 ].Value = model.FirstName;
if (SQLHelper.RunQuery( " ClassName_Add " , parameters))
{
model.Field = ( int )parameters[ 0 ].Value;
model.Field1 = ( int )parameters[ 1 ].Value;
return true ;
}
else
{
return false ;
}
}
/// <summary>
/// 更新记录
/// </summary>
public bool Update(NameSpace.Model.ClassName model)
{
SqlParameter[] parameters = {
new SqlParameter( " @EmployeeID " ,SqlDbType.Int, 4 ),
new SqlParameter( " @LastName " ,SqlDbType.NvarChar, 20 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 ),
new SqlParameter( " @BirthDate " ,SqlDbType.DateTime),
new SqlParameter( " @Sex " ,SqlDbType.NvarChar, 1 ),
new SqlParameter( " @Address " ,SqlDbType.NvarChar, 200 ),
new SqlParameter( " @Company " ,SqlDbType.NvarChar, 100 ),
new SqlParameter( " @Age " ,SqlDbType. int , 4 ),
new SqlParameter( " @Phone " ,SqlDbType.NvarChar, 30 ),
new SqlParameter( " @Mobile " ,SqlDbType.NvarChar, 20 ),
new SqlParameter( " @UserId " ,SqlDbType.Int, 10 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 ),
new SqlParameter( " @FirstName " ,SqlDbType.NvarChar, 10 )};
parameters[ 0 ].Value = model.EmployeeID;
parameters[ 1 ].Value = model.LastName;
parameters[ 2 ].Value = model.FirstName;
parameters[ 3 ].Value = model.BirthDate;
parameters[ 4 ].Value = model.Sex;
parameters[ 5 ].Value = model.Address;
parameters[ 6 ].Value = model.Company;
parameters[ 7 ].Value = model.Age;
parameters[ 8 ].Value = model.Phone;
parameters[ 9 ].Value = model.Mobile;
parameters[ 10 ].Value = model.UserId;
parameters[ 11 ].Value = model.FirstName;
parameters[ 12 ].Value = model.FirstName;
parameters[ 13 ].Value = model.FirstName;
if (SQLHelper.RunQuery( " ClassName_Update " , parameters))
{
return true ;
}
else
{
return false ;
}
}
/// <summary>
/// 删除
/// </summary>
public bool Delete( int Field, int Field1)
{
SqlParameter[] parameters = {
new SqlParameter( " @Field " ,SqlDbType.Int, 4 ),
new SqlParameter( " @Field1 " ,SqlDbType.Int, 4 )};
parameters[ 0 ].Value = Field;
parameters[ 1 ].Value = Field1;
if (SQLHelper.RunQuery( " ClassName_Delete " , parameters))
{
return true ;
}
else
{
return false ;
}
}
/// <summary>
/// 获取实体
/// </summary>
public NameSpace.Model.ClassName GetModel( int Field, int Field1)
{
SqlParameter[] parameters = {
new SqlParameter( " @Field " ,SqlDbType.Int, 4 ),
new SqlParameter( " @Field1 " ,SqlDbType.Int, 4 )};
parameters[ 0 ].Value = Field;
parameters[ 1 ].Value = Field1;
NameSpace.Model.ClassName model = new NameSpace.Model.ClassName();
DataTable dt = SQLHelper.QueryTable( " ClassName_GetModel " , parameters);
if (dt.Rows.Count > 0 )
{
if (dt.Rows[ 0 ][ " EmployeeID " ].ToString() != "" )
{
model.EmployeeID = int .Parse(dt.Rows[ 0 ][ " EmployeeID " ].ToString());
}
model.LastName = dt.Rows[ 0 ][ " LastName " ].ToString();
model.FirstName = dt.Rows[ 0 ][ " FirstName " ].ToString();
if (dt.Rows[ 0 ][ " BirthDate " ].ToString() != "" )
{
model.BirthDate = int .Parse(dt.Rows[ 0 ][ " BirthDate " ].ToString());
}
model.Sex = dt.Rows[ 0 ][ " Sex " ].ToString();
model.Address = dt.Rows[ 0 ][ " Address " ].ToString();
model.Company = dt.Rows[ 0 ][ " Company " ].ToString();
if (dt.Rows[ 0 ][ " Age " ].ToString() != "" )
{
model.Age = int .Parse(dt.Rows[ 0 ][ " Age " ].ToString());
}
model.Phone = dt.Rows[ 0 ][ " Phone " ].ToString();
model.Mobile = dt.Rows[ 0 ][ " Mobile " ].ToString();
if (dt.Rows[ 0 ][ " UserId " ].ToString() != "" )
{
model.UserId = int .Parse(dt.Rows[ 0 ][ " UserId " ].ToString());
}
model.FirstName = dt.Rows[ 0 ][ " FirstName " ].ToString();
model.FirstName = dt.Rows[ 0 ][ " FirstName " ].ToString();
model.FirstName = dt.Rows[ 0 ][ " FirstName " ].ToString();
}
else
{
model = null ;
}
dt.Clear();
dt.Dispose();
return model;
}
}
}
怎么样,绝对不会比你见过的代码生成器弱,而这个使用是如此的简单,当然还可以生成bll,webui层的代码.不过都需要自己写一个xslt文件而已,大家用了这个肯定会有想法
不想只是这样麻烦的使用,如何把他封装一下,变成有界面的,真正的代码生成器.其实也简单 ,我下面写了一小demo,代码很简单,大家可以下载看看..
轮子就这样被我造出来了,如此简单!
不敢怠慢,奉上代码奉上/Files/mextb1860/CodeFactory.rar
欢迎各位踊跃的仍鸡蛋,和指点错误!