手寫代碼生成器


手寫代碼生成器

在我們介紹三層的時候,大家是不是發現我們寫每一個功能的時候是不是非常的麻煩呢?

像其中的一個model,如果屬性特別多的時候,寫起來非常的慢。

像其中一些基本的功能我們可以使用代碼生成器,然后在此基礎上改下就好了。

但是:一定要一開始手寫三層,不要依賴於代碼生成器,等手寫熟練了以后再用代碼生成器。

先看下動軟代碼生成器:

                       

一、動軟代碼生成器的安裝

下面我演示一下如何使用:

 

二、連接數據庫

 

三、設定選項進行連接

在加載數據庫的時候出現: “添加服務器配置失敗,請檢查是否有寫入權限或文件是否存在”的錯誤的解決辦法.

找到安裝動軟的目錄,如果裝在C盤時,默認為C:\Program Files\Maticsoft\Codematic2,給此文件夾的安全屬性中當前用戶添加全部權限;或添加Everyone用戶,給Everyone角色添加全部權限。

 

四、選定數據庫-加載所有表

 

五、使用代碼生成器生成三層

為了理解代碼生成器的原理,我們寫個簡單生成model的代碼生成器。

 

用戶可能會連接各種各樣的數據庫,連接字符串不能寫死.讓用戶選擇或者是自己輸入也行.

為了方便,我在文本框里面寫好連接的字符串.

 

六、畫好界面,寫好連接字符串

 

七、快速try-catch方法

 

測試連接演示

 

八、獲取數據庫中的表

 

九、將表名綁定代碼

接下來我們完成,點擊一個表名一點按鈕,生成一個model。

讓用戶指定下命名空間,類名跟表名一樣就行了。

 

十、畫好接下來用到的界面

當我點生成的時候,就開始生成代碼了.大家思考下,當我點生成的時候執行什么代碼.

首先,獲取現在的表.生成代碼例如像model中的很多代碼是固定的.拼個字符串就行了.

接下來的問題是,這張表中有多少個列.怎么獲取表中有多少個列呢?

用下這個事務: INFORMATION_SCHEMA.COLUMNS.

接下來我就該寫代碼了.

 

十一、生成model代碼框架代碼

 

生成model代碼演示

接下來我們改寫model里面屬性的代碼了。

 

十二、存儲數據的類

 

十三、生成model里的屬性代碼的代碼

下面請大家思考下,怎樣才能判斷數據類型,進而使之轉換。

 

生成model里的屬性演示

插入代碼位置:

View Code
 1                //4.循環遍歷listColumns(列集合)
 2                 foreach (ColumnInfo item in listColumns)
 3                 {
 4                     //注:這里我寫的是自動屬性的,先寫字段,再寫屬性也行。
 5                     //問題1是數據類型是數據庫中的,不是C#中的。2是屬性名應該大寫-所以下面封裝了方法,處理這個。
 6                     sbCode.AppendLine("public string " + CheckDbType(item) + " " + ChangePropertyName(item.ColumnName));
 7                     sbCode.AppendLine("{ ");
 8                     sbCode.AppendLine("get;");
 9                     sbCode.AppendLine("set;");
10                     sbCode.AppendLine("}");
11                 }
12 
13 
14                 sbCode.AppendLine("}");
15                 sbCode.AppendLine("}");
16                 txtCode.Text = sbCode.ToString();
17             }
18 
19         }
20         private string CheckDbType(ColumnInfo p)
21         {
22             #region 1
23             //1.判斷是不是值類型
24             //2.判斷是不是為空
25             //3.把nverchar轉換成string類型
26             //下面這么寫不太合適
27             //string dbType = string.Empty;
28             //switch (p.DataType.ToLower())
29             //{
30             //    case "char":
31             //    case "varchar":
32             //    case "nchar":
33             //    case "nvarchar":
34             //    case "text":
35             //    case "ntext":
36             //        dbType = "string";
37             //        break;
38             //    case "int":
39             //        dbType = "int";
40             //        break;
41             //    case "bit":
42             //        dbType = "bool";
43             //        break;
44             //    default:
45             //        dbType = "unknow";
46             //        break;
47             //}
48             //if (p.IsNullable.ToLower() == "yes")
49             //{
50             //    dbType += "?";
51             //}
52             //return dbType;
53             #endregion
54 
55             #region 2
56             Type dbType = null;
57             switch (p.DataType.ToLower())
58             {
59                 case "char":
60                 case "varchar":
61                 case "nchar":
62                 case "nvarchar":
63                 case "text":
64                 case "ntext":
65                     dbType = typeof(string);
66                     break;
67                 case "int":
68                     dbType = typeof(int);
69                     break;
70                 case "bit":
71                     dbType = typeof(bool);
72                     break;
73             }
74             if (dbType!=null)
75             {
76                 if (dbType.IsValueType && p.IsNullable.ToLower ()=="yes")
77                 {
78                     return dbType.ToString() + "?";  
79                 }
80             }
81             return dbType.ToString();
82             #endregion
83             
84         }

十四、mygeneration

下面為大家介紹CodeSmith代碼生成器。

 

十五、CodeSmith安裝過程

CodeSmith的好處就是自己可以寫模板。

下面我們自己寫個模板

 

十六、新建模板

雙擊打開

 

十七、在模板中哪能寫C#代碼

 

十八、生成,執行

接下來,我寫個標志並且輸出。

 

十九、第一個需要說明的地方

 

二十、發件人,收件人改成方法替代

像這種情況,如果我要改發件人,收件人得話,比較的麻煩。所以,不光要有方法,我在里面添加幾個參數。

 

二十一、添加參數

 

二十二、設置參數

寫完以后編譯一下,軟件右下角就是剛寫的三個參數。

 

二十三、又下角顯示出剛設定的三個參數

接下來看下怎么用這三個參數。

 

二十四、參數的用法一

 

二十五、改變參數以后,輸出的內容頁變了

模板的意義:寫一些固定的字符串,不固定的字符串可以用方法和參數來代替,這就是模板的意義。

 

二十六、第一句話的解釋

在安裝CodeSmith代碼生成器的過程中可能會遇到些小問題,本人在這提供我安裝好的,大家直接在自己的電腦上進行安裝就行了。

 

二十七、CodeSmith代碼生成器安裝過程

 

二十八、寫好的模板

接下來我們自己寫模板生成一個model。

生成model模板需要一個命名空間,需要一個表。這兩個設定成參數。

 

二十九、model的參數設定

添加數據庫

 

三十、給參數表設定值的步驟

接下來生成實體model

 

三十一、生成實體model

 

三十二、讓屬性名變成大寫的方法

修改數據類型用我們現成的方法:

插入代碼位置:

View Code
 1 public string GetCSharpTypeFromDBFieldType(ColumnSchema column)
 2     {
 3                 string type;
 4         switch (column.DataType)
 5         {
 6             case DbType.AnsiString: type= "string";break;
 7             case DbType.AnsiStringFixedLength: type= "string";break;
 8             case DbType.Binary: type= "byte[]";break;
 9             case DbType.Boolean: type= "bool";break;
10             case DbType.Byte: type= "byte";break;
11             case DbType.Currency: type= "decimal";break;
12             case DbType.Date: type= "DateTime";break;
13             case DbType.DateTime: type= "DateTime";break;
14             case DbType.Decimal: type= "decimal";break;
15             case DbType.Double: type= "double";break;
16             case DbType.Guid: type= "Guid";break;
17             case DbType.Int16: type= "short";break;
18             case DbType.Int32: type= "int";break;
19             case DbType.Int64: type= "long";break;
20             case DbType.Object: type= "object";break;
21             case DbType.SByte: type= "sbyte";break;
22             case DbType.Single: type= "float";break;
23             case DbType.String: type= "string";break;
24             case DbType.StringFixedLength: type= "string";break;
25             case DbType.Time: type= "TimeSpan";break;
26             case DbType.UInt16: type= "ushort";break;
27             case DbType.UInt32: type= "uint";break;
28             case DbType.UInt64: type= "ulong";break;
29             case DbType.VarNumeric: type= "decimal";break;
30             default:
31             {
32                 type= "__UNKNOWN__" + column.NativeType;
33                 break;
34             }
35         }
36         if(column.AllowDBNull&&
37             column.SystemType.IsValueType)
38         {
39             type=type+"?";
40         }
41         return type;
42     }

三十三、修改數據類型的方法:

這里我們提供給大家已經寫好的模板:

 

三十四、添加寫好的模板

 

三十五、看下我們寫好的model模板

三十六、三層中模板的應用

 

三十七、為模板添加作者簽名

 

三十八、處理bll層生成在指定文件夾的解決辦法

下面我們把sqlhelper也繼承到主模板里面。

 

三十九、了解清晰主模板相關信息

好了解清楚這些,再把sqlhelper繼承進來就相當的容易了。

 

四十、把sqlhelper繼承進主模板

 

四十一、加載到項目里面

接下來再說一個問題

比如說我生成好的bLL文件

我還需要在里面加東西,我辛辛苦苦加了很多個方法在里面。同時,我又發現代碼生成器里面有個地方不完美,稍微修改了下模板。重新生成以后,發現我上午加的代碼沒有了。

也就是說通過代碼生成器生成的代碼,跟我們手動寫的代碼應該分開來存儲。

在同一個命名空間下,類名一樣的,加partial部分類。編譯的時候,自動編譯成一個類來運行。

注意文件名不能重名。

 

四十二、partial關鍵字的用法

代碼生成器生成的代碼都含有partial關鍵字,如果我們想擴展的話,我們寫在自己拓展的partial 類里面。

一般情況下代碼生成器生成的代碼不需要做任何的改動。如果覺得改動比較的大,不如去改下模板,重新生成一下。

 發送郵件程序涵很多邪惡的東西,就先不發了。。。

作者近期文章列表:

C#基礎教程(完全免費,獻給代碼愛好者的最好禮物。注:本作者分享自己精心整理的C#基礎教程,無任何商業目的。
希望與更多的代碼愛好者交流心得,也請高手多多指點!!!)
三層及其它內容 遞歸
三層(一)
三層相關案例(及常見的錯誤)
三層實例(內涵Sql CRUD)
SQL數據庫 ADO.net 數據庫的應用圖解一
數據庫的應用詳解二
ADO.NET(內涵效率問題)
ADO.NET實例教學一
面向過程,面向對象中高級 面向過程,面向對象的深入理解一
面向過程,面向對象的深入理解二
面向對象的深入理解三
winform基礎 Winform基礎
winform中常用的控件
面向過程 三種循環的比較
C#中的方法(上)
我們常見的數組
面向對象 思想的轉變
C#中超級好用的類
C#中析構函數和命名空間的妙用
C#中超級好用的字符串
C#中如何快速處理字符串
值類型和引用類型及其它
ArrayList和HashTable妙用一
ArrayList和HashTable妙用二
文件管理File類
多態
C#中其它一些問題的小節
GDI+ 這些年我收集的GDI+代碼
這些年我收集的GDI+代碼2
HTML概述以及CSS 你不能忽視的HTML語言
你不能忽視的HTML語言2精編篇
你不能忽視的HTML語言3
CSS基本相關內容--中秋特別奉獻
CSS基本相關內容2
JavaScript基礎 JavaScript基礎一
jQuery jQuery(內涵: jquery選擇器)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM