手寫代碼生成器
在我們介紹三層的時候,大家是不是發現我們寫每一個功能的時候是不是非常的麻煩呢?
像其中的一個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選擇器) |
