这个系统好久没有更新了,人也慢慢变懒了,从现在开始每个月至少写三篇文章,欢迎大家监督。对了预告一下,该系列完成以后将为大家带来WebApp开发系列篇,敬请期待。先上几张图,放在文章最后面欢迎预览!
本章开始将会为大家讲解NVelocity的用法,并带领大家实现一个简单的代码生成器。
NVelocity的基础知识请参考上篇文章NVelocity语法介绍
阅读目录
NVelocity实现代码生成器
本章总结
新系列文章图片预览
工具源代码下载
学习使用
回到顶部
NVelocity实现代码生成器
实现一款简单的代码生成器,需要先定义好代码结构。这里仅生成三层模式中的实体层,后续复杂结构代码生成大家可以自己动手写一下。
1、 模版定义
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Mysoft.Code.Entity { #foreach($p in $T.Rows)## #if($velocityCount==1)## ///<summary>$p.get_item("table_name_c")</summary> public class $p.get_item("table_name") { #end ///<summary>#if($p.get_item("field_name_c")!="")$p.get_item("field_name_c") #else $p.get_item("field_name") #end</summary> public#if($p.get_item("date_type")=="bigint") double#else string#end $p.get_item("field_name") { get; set; } #end } }
可以看到模版很简单,最终生成的代码类似下面
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace Mysoft.Code.Entity { ///<summary>阶段设置表</summary> public class Pack_Stage { ///<summary>更新包GUID </summary> public string StageGUID { get; set; } ///<summary>更新包名称 </summary> public string StageName { get; set; } ///<summary>阶段序号 </summary> public string OrderNo { get; set; } ///<summary>是否开始合并包 </summary> public string IsHBPackage { get; set; } } }
View Code
2、从数据库中读取所有表和表的相关信息
SQL Sever的内置表和视图提供了许多有用信息,比如查询所有的用户表和表列信息说明。
sys.tables:用户表相关信息
sys.extended_properties:表的和列的相关描述信息
SELECT T.name AS table_name ,T.OBJECT_ID, ISNULL(CONVERT(VARCHAR(MAX), E.value), '') AS table_name_c , C.name AS field_name , ISNULL(CONVERT(VARCHAR(MAX), D.value), '') AS field_name_c , ROW_NUMBER() OVER(PARTITION BY T.name ORDER BY C.colid) AS field_sequence , TYPE_NAME(C.xtype) AS date_type , (CASE WHEN EXISTS ( SELECT 1 FROM sysobjects WHERE xtype = 'PK' AND name IN ( SELECT name FROM sysindexes WHERE id = C.id AND indid IN ( SELECT indid FROM sysindexkeys WHERE id = C.id AND colid = C.colid ) ) ) THEN 1 ELSE 0 END) AS pk , ISNULL(C.isnullable, 1) AS isnullable , ISNULL(COLUMNPROPERTY(c.id, c.name, 'IsIdentity'), 0) AS isidentityFROM sys.tables AS T LEFT JOIN syscolumns AS C ON c.id = T.object_id LEFT JOIN sys.extended_properties AS D ON D.major_id = T.object_id AND D.minor_id = C.colid AND D.major_id = C.id LEFT JOIN sys.extended_properties AS E ON E.major_id = T.object_id AND E.minor_id = 0
view Code
大家可以看下上面的SQL,基本上把表的相关信息都查询出来了,下章将着重讲解这个知识点。
3、代码生成
有了模版和数据源就可以生成最终代码了,有不懂的可以参考上篇,这里上最终效果图。大家可以下载示例代码自行查看。
本章总结
整个代码生成器做起来还是不困难的,前台界面搭建用到了最近比较流行的miniui,有兴趣的自己可以下载研究。实例中代码文件输出路径和数据库链接配置在了Web.Config中使用者可自行修改。
另外开发过程中遇到的几个问题也分享一下:
1.NVelocity中如何使用DataTable做为数据源
#foreach($p in $T.Rows)
($p.get_item("date_type")
#end
2.DataTable进行数据过滤
DataView dv = dt.DefaultView;
dv.RowFilter = "tableid='" + id + "'";
DataTable dt2 = dv.ToTable();
好了本章内容就这么多了,希望读完对你有所帮助!