数据字典生成工具之旅(7):NVelocity实现代码生成器

      这个系统好久没有更新了,人也慢慢变懒了,从现在开始每个月至少写三篇文章,欢迎大家监督。对了预告一下,该系列完成以后将为大家带来WebApp开发系列篇,敬请期待。先上几张图,放在文章最后面欢迎预览!

     本章开始将会为大家讲解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;
       }
       }   
}

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 isidentity
FROM   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

   大家可以看下上面的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();

   好了本章内容就这么多了,希望读完对你有所帮助!

回到顶部

新系列文章图片预览

回到顶部

工具源代码下载

      目前总共有经过了七个版本的升级,现在提供最新版本的下载地址

数据字典生成工具V2.0安装程序

最新安装程序

数据字典生成工具源代码

最新源代码

http://code.taobao.org/svn/DataDicPub

SVN最新源码共享地址

回到顶部

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我的博客

TP字段缓存

TP字段缓存DB_FIELDS_CACHE,默认开启 1、影响(减少数据库查询) 2、但是也会有一个问题,保存规则是按照数据库+model名字(小写)来的,这样...

3395
来自专栏Java架构师历程

MySQL的三大引擎

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本 的差别为:

982
来自专栏我的博客

ADODB简介以及简单使用

1、adodb数据库类介绍(http://adodb.sourceforge.net/) 虽然 PHP 是建构 Web 系统强有力的工具,但是 PHP 存取数据...

3207
来自专栏Python

MySQL常见的库操作,表操作,数据操作集锦及一些注意事项

一 库操作(文件夹) 1 数据库命名规则 可以由字母、数字、下划线、@、#、$ 区分大小写 唯一性 不能使用关键字如 create select 不能单独使用数...

1869
来自专栏CodingToDie

MySQL MVCC(多版本控制)

1. MySQL 中的事务 MySQL 提供了两种事务型的存储引擎:InnoDB 和 NDB Cluster 。另外还有一些第三方存储引擎也支持事务 1. My...

3407
来自专栏Netkiller

Oracle 表空间管理

33.12. Oracle 表空间 33.12.1. 查询空闲表空间 select tablespace_name,file_id,block_id,bytes...

2736
来自专栏数据和云

ctas方式建表时的redo和undo

黄廷忠(网名:认真就输) 云和恩墨技术专家 个人博客:http://www.htz.pw/ 测试环境:OS:RHEL 5.4 X86 DB:10.2.0.4 ...

3295
来自专栏我和PYTHON有个约会

33.企业级开发进阶6:数据库操作

python作为一个编程语言,在开发B/S或者C/S结构的软件时,不可避免的会设计到和数据库之间的交互操作,和其他高级的面向对象的语言一样,Python在操作数...

892
来自专栏Netkiller

Oracle 表空间管理

33.12. Oracle 表空间 33.12.1. 查询空闲表空间 select tablespace_name,file_id,block_id,bytes...

2615
来自专栏张善友的专栏

.NET Web 自动化测试工具

Inspired by Watir development of WatiN started in December 2005 to make a simila...

1699

扫码关注云+社区