代码生成器是提高生产力的工具,目前的代码生成器太多了,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
欢迎各位踊跃的仍鸡蛋,和指点错误!