這個系統好久沒有更新了,人也慢慢變懶了,從現在開始每個月至少寫三篇文章,歡迎大家監督。對了預告一下,該系列完成以后將為大家帶來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最新源碼共享地址 |
學習使用
如果你使用了該工具,或者想學習該工具,歡迎加入這個小組,一起討論數據字典生成工具、把該工具做的更強,更方便使用,一起加入147425783 QQ群。
更多數據字典生成工具資料請點擊數據字典生成工具專題。