• 数据字典生成工具之旅(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;
           }
           }   
    }
    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 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
    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();

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

    新系列文章图片预览

       
         
         

     

    工具源代码下载

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

    数据字典生成工具V2.0安装程序 最新安装程序
    数据字典生成工具源代码 最新源代码
    http://code.taobao.org/svn/DataDicPub SVN最新源码共享地址

    学习使用

          如果你使用了该工具,或者想学习该工具,欢迎加入这个小组,一起讨论数据字典生成工具、把该工具做的更强,更方便使用,一起加入147425783 QQ群

          更多数据字典生成工具资料请点击数据字典生成工具专题

  • 相关阅读:
    怎样快速缩小问题的排查范围
    Android Activity启动模式图解
    只有理解了部分是怎么组合到整体上的,才能理解元素的真正功能
    aop收口要寻找最窄的切面
    错误的本质是不一致
    代理:接口一致、创建混入(替代)、消息转发
    分解与组合是终极方法论(还原论)
    OC之NSURLsession
    一个高频问题:异步操作会创建线程吗?
    关于Chrome跨域The request client is not a secure xxx相关提示的解决
  • 原文地址:https://www.cnblogs.com/yanweidie/p/3917229.html
Copyright © 2020-2023  润新知