动软代码生成器
動軟代碼:
public <#= returnValue #> Add(<#= ModelSpace #> model) ??
C#代碼:
public int Add(BW_MinPressure.Model.m_Group model)
動軟代碼:
<# foreach (ColumnInfo c in host.Fieldlist)
{ #>private <#= CodeCommon.DbTypeToCS(c.TypeName) #> _<#= c.ColumnName.ToString().ToLower() #>; ? ??
<# } #>
C#代碼:
private int _id; ? ??
private string _vc_name; ? ??
private string _vc_memo; ? ??
private int _i_flag; ? ??
動軟代碼:
<#if (identityKey!=null) {#>strSql.Append(";select @@IDENTITY");<#}#>
C#代碼:
strSql.Append(";select @@IDENTITY");
<#=identityKey.ColumnName#> 標示列名
<#= host.Keys[0].ColumnName #> 主鍵列名
?
動軟代碼:
/// <summary>
??/// 是否存在該記錄
??/// </summary>?
??public bool Exists(<#= CodeCommon.GetInParameter(host.Keys, false) #>)
??{
???return dal.Exists(<#= CodeCommon.GetFieldstrlist(host.Keys, false)#>);
??}
C#代碼:
/// <summary>
??/// 是否存在該記錄
??/// </summary>
??public bool Exists(int ID)
??{
??? ?return dal.Exists(ID);
??}
目錄
?
一.????????功能介紹
二.????????下載安裝
三.????????模板代碼生成
四.????????模板代碼批量生成
五.????????代碼生成規則設置
六.????????模板編寫教程
1.模板指令聲明塊?<#@??#>
(1)?模板指令
(2)?參數指令
(3)?輸出指令
(4)?程序集指令
(5)?導入指令
(6)?包含指令
2.代碼語句塊:?<#???#>
3.表達式塊:<#=??#>
4.類功能控制塊:<#+??#>
5.文本塊輸出
6.顯示錯誤和警告
7.模板示例講解
8.Host對象屬性列表
9.Host對象方法列表
10.CodeCommon工具類常用方法
?
?
一.????功能介紹
動軟.Net代碼生成器 是一款為.Net程序員設計的全功能自動代碼生成器,也是一個智能化軟件開發平臺,它可以生成基于面向對象的思想和三層架構設計的代碼,結合了軟件開發中經典的思想和設計模式,融入了工廠模式,反射機制等等一些思想。主要實現在對應數據庫中表的基類代碼的自動生成,包括生成屬性、添加、修改、刪除、查詢、存在性、Model類構造等基礎代碼片斷,支持不同架構代碼生成,使程序員可以節省大量機械錄入的時間和重復勞動,而將精力集中于核心業務邏輯的開發。新版本中除了程序集組件模板,也同樣支持用戶自定義文本模板,像寫ASPX代碼一樣寫模板,一鍵代碼生成,更方便,更靈活。
動軟讓軟件開發變得輕松而快樂!讓企業不斷提升開發效率,同樣的時間創造出更大的價值。
二.????下載安裝
1.??系統要求:
Microsoft Windows2000/XP/2003/7?或者更高。機器必須安裝.NET Framework v2.0。
2.??官方下載地址:http://www.maticsoft.com/download.aspx
3.??下載解壓后安裝包有如下文件:
Codematic2.msi??是動軟.NET代碼生成器的安裝文件。
Builder文件夾是代碼生成插件的源碼,動軟.NET代碼生成器支持可擴展的代碼生成插件,用戶可以定制自己的代碼生成的插件,根據接口開發自己的代碼生成方式,按自己的需求進行代碼生成。
Codematic_Data.MDF和Codematic_Log.LDF?是通過動軟新建項目中所帶管理模塊所需要的數據庫文件。后臺管理員默認登錄用戶名:admin??密碼:1
?
4.??雙擊Codematic2.msi?進行直接安裝即可。
安裝動軟時,如果用戶機器360彈出警告,那僅僅是個簽名認證提示,并非木馬,選擇“繼續安裝”,然后點擊“確定”即可。
動軟鄭重聲明:?動軟.NET代碼生成器,絕無插件木馬,純綠色軟件。請放心安裝。
5.??安裝成功后,在開始-菜單和桌面上會有動軟.NET代碼生成器的圖標。
三.????模板代碼生成
1.??在左側【數據庫視圖】,選中表,右鍵菜單【模板代碼生成】
2.??然后,出現單表的代碼生成器界面,我們設置自己需要更改的信息
備注:代碼還有一些生成規則,是在菜單【工具】-【選項】-【代碼生成設置】中進行設置。
?
3.??然后,點擊工具欄【生成代碼】或者【生成代碼】按鈕,即可生成該類的代碼:
生成的代碼,可以直接復制到項目文件中,也可以右鍵保存成CS文件。通過窗體下面的Tab按鈕可以來回切換設計視圖和代碼。
4.??設置模板目錄
?
5.??模板保存
6.???
四.????模板代碼批量生成
1.??選中數據庫或者表,然后單擊右鍵菜單【模板代碼批量生成】
2.??出現的窗口和新建項目基本相似,只是多了一個選中架構的選項:
?
3.??選則要生成的表,然后點擊【導出】。
4.??在生成的文件夾中,我們可以看到:
?
批量生成代碼只生成業務表的代碼,不再有解決方案文件和項目文件,以及其它類庫等。我們可以將生成的這些文件直接拖到現有的解決方案中即可
?
五.????代碼生成規則設置
打開菜單【工具】-【選項】-【代碼生成設置】
?
這些配置保存后,在生成代碼的時候將按照這個規則進行生成。
代碼生成的規則設置范圍還在不斷增加中。
?
另外,不同數據庫類型的數據類型各有不同,這里提供了字段類型和C#中的類型建立映射關系,生成代碼時將按映射關系來生成代碼字段屬性的類型。
?
?
六.????模板編寫教程
模板的大體分為5塊內容:模板指令聲明,代碼語句塊,表達式塊,類功能控制塊,文本塊輸出。下面我們分別來介紹一下這5塊內容的語法和使用說明。
1.??模板指令聲明塊?<#@??#>
和ASP.NET頁面的指令一樣,它們出現在文件頭,通過<#@…#>表示。其中<#@ template?…#>指令是必須的,用于定義模板的基本屬性。
(1)????模板指令
<#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] #>
例如
<#@ template language="C#v3.5" hostSpecific="true" debug="true" #>
Language??這里可以指定模板使用的語言。
hostSpecific="true"?表示是否使用特定的host,host里面包含了模板使用的各種對象。
注意:
所有屬性值必須用雙引號都括起來。如果值本身包含引號,則必須使用?\?字符對這些引號進行轉義。?指令通常是模板文件或包含的文件中的第一個元素。
?
(2)????參數指令
<#@ parameter type="Full.TypeName" name="ParameterName" #>
?
(3)????輸出指令
<#@ output extension=".fileNameExtension"??encoding="encoding"??#>
output extension=".cs"???指定生成文件的擴展名。
encoding="encoding"????指定生成文件的編碼。
?
(4)????程序集指令
<#@ assembly name="System.Data" #>
用于添加程序集引用,如果要使用第三方程序集,那么最好在項目中添加引用。
注:您應使用絕對路徑的名稱,或者路徑名稱中使用標準的宏的名稱。
例如:?<#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>
?
(5)????導入指令
<#@ import namespace="System.Data" #>
導入要使用的命名空間,注意:這里的命名空間必須要在前面指定的程序集里面找得到的,比如我指定命名空間"System.Data","System.Data.Common",這些在程序集System.Data中都有的
?
(6)????包含指令
<#@ include file="test.tt" #>?導入模板,類似Html的include用法
include?指令插入其他模板文件的文本。
例如,下面的指令插入?test.txt?的內容。?<#@ include file="c:\test.txt" #>
在處理時,被包含內容就像是包含文本模板的組成部分一樣。?不過,即使?include?指令后跟普通文本塊和標準控制塊,也可以包含編寫有類功能塊?<#+...#>?的文件
?
2.??代碼語句塊:?<#???#>
在模板文件中,可以混合使用任意數量的文本塊和標準控制塊。中間是一段通過相應編程語言編寫的程序調用,我們可以通過代碼語句快控制文本轉化的流程。
注意:不能在控制塊中嵌套控制塊。
<#@ output extension=".txt" #>
<#
????for(int i = 0; i < 4; i++)
????{
#>
?Hello!
<#
????}
#>
?
?
3.??表達式塊:<#=??#>
表達式控制塊計算表達式并將其轉換為字符串。?該字符串將插入到輸出文件中。
例如:?<#= 2 + 3 #>
表達式可以包含作用域中的任何變量。?例如,下面的塊輸出數字行:
<#@ output extension=".txt" #>
<#
????for(int i = 0; i < 4; i++)
????{
#>
This is hello number <#= i+1 #>: Hello!
<#
????}
#>
?
?
4.??類功能控制塊:<#+??#>
如果文本轉化需要一些比較復雜的邏輯,我們需要寫在一個單獨的輔助方法中,甚至是定義一些單獨的類,我們就是將它們定義在類特性塊中。類功能控制塊定義屬性、方法或不應包含在主轉換中的所有其他代碼。?類功能塊常用于編寫幫助器函數。?通常,類功能塊位于單獨的文件中,這樣它們可以包含在多個文本模板中。?類功能控制塊以?<#+ ... #>?符號分隔。
例如,下面的模板文件聲明并使用一個方法:
<#@ output extension=".txt" #>
Squares:
<#
????for(int i = 0; i < 4; i++)
????{
#>
????The square of <#= i #> is <#=?Square(i+1) #>.
<#
????}
#>
That is the end of the list.
<#+??// Start of class feature block
private?int Square(int i)
{
????return?i*i;
}
#>
?
類功能必須編寫在文件末尾。不過,即使?include指令后跟標準塊和文本,也可以?<#@include #>?包含類功能的文件。例如下面代碼則會報錯:
List of Squares:
<#
???for(int i = 0; i < 4; i++)
???{??WriteSquareLine(i); }
#>
End of list.
<#+??// Class feature block
private?void WriteSquareLine(int i)
{
#>
???The square of <#= i #> is <#= i*i #>.
<#??
}
#>
?
?
5.??文本塊輸出
可以使用?Write()?和?WriteLine()?方法在標準代碼塊內追加文本,而不必使用表達式代碼塊。?它們可幫助縮進輸出和報告錯誤。
下面兩個代碼塊在功能上是等效的。
包含表達式塊的代碼塊
?<#
int?i = 10;
while?(i-- > 0)
????{ #>
????????<#= i #>
????<# }
#>
使用?WriteLine()?的代碼塊
<#
????int?i?=?10;
????while?(i-- >?0)
????{
????????WriteLine((i.ToString()));
????}
#>
?
Write()?和?WriteLine()?方法有兩個重載,其中一個重載接受單個字符串參數,另一個重載接受一個復合格式字符串以及將包含在字符串中的對象數組(與?Console.WriteLine()?方法類似)。
下面兩種?WriteLine()?用法在功能上是等效的:
?<#
????string?msg = "Say: {0}, {1}, {2}";
????string?s1 = "hello";
????string?s2 = "goodbye";
????string?s3 = "farewell";
???
????WriteLine(msg, s1, s2, s3);
????WriteLine("Say: hello, goodbye, farewell");
#>
?
設置文本模板輸出縮進的格式。
?CurrentIndent?字符串屬性顯示文本模板中的當前縮進,該類還具有一個?indentLengths?字段,該字段是已添加的縮進的列表。?
PushIndent()?方法增加縮進,
PopIndent()?方法減少縮進。
ClearIndent()?方法,刪除所有縮進。
?
下面的代碼塊演示這些方法的用法:
?<#
????WriteLine(CurrentIndent + "Hello");
????PushIndent("????");
????WriteLine(CurrentIndent + "Hello");
????PushIndent("????");
????WriteLine(CurrentIndent + "Hello");
????ClearIndent();
????WriteLine(CurrentIndent + "Hello");
????PushIndent("????");
????WriteLine(CurrentIndent + "Hello");
#>
此代碼塊產生以下輸出:
?
?Hello
????????Hello
????????????????Hello
Hello
????????Hello
?
6.??顯示錯誤和警告
可以使用錯誤和警告實用工具方法向?Visual Studio?錯誤列表添加消息。?例如,下面的代碼向錯誤列表添加一條錯誤消息。
?<#
??try
??{
????string?str = null;
????Write(str.Length.ToString());
??}
??catch?(Exception e)
??{
????Error(e.Message);
??}
#>?
?
?
7.??模板示例講解
?
8.??Host對象屬性列表
Host提供了一下屬性和方法,方便編寫模板時調用。
| TableHost屬性 | 類型 | 說明 |
| DbName | string | 當前數據庫名。 |
| DbType | string | 當前數據庫類型:SQL2000,SQL2005,SQL2008,Oracle,OleDb,MySQL,SQLite |
| TableList | List<TableInfo> | 當前數據庫所有的表集合,返回List<TableInfo> |
| DbHelperName | string | 數據庫訪問類名,例如:DbHelperSQL |
| ProjectName | string | 項目名稱 |
| ProcPrefix | string | 存儲過程前綴,例如sp_ |
| ModelPrefix | string | Model類名前綴 |
| ModelSuffix | string | Model類名后綴 |
| BLLPrefix | string | BLL類名前綴 |
| BLLSuffix | string | BLL類名后綴 |
| DALPrefix | string | DAL類名前綴 |
| DALSuffix | string | DAL類名后綴 |
| TabNameRule | string | 類命名規則: same(保持原樣)??lower(全部小寫)??upper(全部大寫) 工具-選項-代碼生成設置中進行設置。 |
| DbParaDbType | string | 得到數據庫字段DbType的類名。例如:SqlDbType |
| preParameter | string | 當前數據庫類型對應的存儲過程參數符號,例如:@ |
| Folder | string | 所屬文件夾 |
| TableName | string | 表名 |
| TableDescription | string | 表的描述信息 |
| Fieldlist | List<ColumnInfo> | 字段集合 |
| Keys | List<ColumnInfo> | 主鍵字段集合 |
| IdentityKey | ColumnInfo | 自動增長標識列;如果沒有則返回null。 |
?
9.??Host對象方法列表
?
| TableHost方法 | 說明 |
| string GetModelClass(string TabName) | 組合得到Model類名:?前綴+類名+后綴 |
| string GetBLLClass(string TabName) | 組合得到BLL類名:?前綴+類名+后綴 |
| string GetDALClass(string TabName) | 組合得到DAL類名:?前綴+類名+后綴 |
| ? | ? |
?
10.?TableInfo??表對象屬性
?
| 屬性 | 類型 | 說明 |
| TabName | string | 表名稱 |
| TabUser | string | 用戶對象 |
| TabType | string | 表類型 |
| TabDate | string | 創建日期 |
?
11.?ColumnInfo??字段信息對象
?
| 屬性 | 類型 | 說明 |
| ColumnOrder | string | 序號 |
| ColumnName | string | 字段名 |
| TypeName | string | 字段類型 |
| Length | string | 長度 |
| Precision | string | 精度 |
| Scale | string | 小數位數 |
| IsIdentity | bool | 是否是標識列 |
| IsPrimaryKey | bool | 是否是主鍵 |
| Nullable | bool | 是否允許空 |
| DefaultVal | string | 默認值 |
| Description | string | 備注 |
?
12.?CodeCommon工具類常用方法
| CodeCommon方法 | 說明 |
| string?DbTypeToCS(string?dbtype) | 得到“數據庫字段類型”對應的“c#類型” |
| bool?isValueType(string?cstype) | 是否C#中的值(可空)類型 |
| string?DbTypeLength(string?dbtype,string?datatype,string?Length) | 得到數據庫字段DbType的類型和長度 |
| ColumnInfo?GetIdentityKey(List<ColumnInfo> keys) | 得到自動增長標識列字段 |
| string?DbParaDbType(string?DbType) | 得到不同數據庫DbType類名,例如SqlDbType |
| string?preParameter(string?DbType) | 得到不同數據庫的存儲過程參數符號,例如:@ |
| string?GetWhereParameterExpression(List<ColumnInfo> keys,?bool?IdentityisPrior,?string?DbType) | 得到Where條件語句?- Parameter方式?(例如:用于Exists?Delete??GetModel?的where) 例如:where??NewsId=@NewsId |
| string?GetPreParameter(List<ColumnInfo> keys,?boolIdentityisPrior,?string?DbType) | 生成sql語句中的參數列表(例如:用于?Exists??Delete?GetModel?的where參數賦值) |
| string?GetInParameter(List<ColumnInfo> keys,?boolIdentityisPrior) | 得到方法輸入參數定義的列表?(例如:用于Exists?Delete??GetModel?的參數傳入) |
| string?GetFieldstrlist(List<ColumnInfo> keys,?boolIdentityisPrior) | 字段的?select?列表,和方法傳遞的參數值 |
| string?GetWhereExpression(List<ColumnInfo> keys,bool?IdentityisPrior) | 得到Where條件語句?- SQL方式?(例如:用于Exists?Delete??GetModel?的where) |
| string?GetModelWhereExpression(List<ColumnInfo> keys,?bool?IdentityisPrior) | 得到Where條件語句?- SQL方式?(例如:用于Exists?Delete??GetModel?的where) |
| string?CutDescText(?string?descText,intcutLen,string?ReplaceText) | 字符串描述截取:要截取的字符串,長度,替代字符串。 |
| ? | ? |
?
輸出效果模板代碼:(復制到模板代碼生成器中執行即可看到效果)
<#@ template language="c#" HostSpecific="True" #>
<#@ output extension= ".cs" #>
<#
TableHost host = (TableHost)(Host);
ColumnInfo identityKey=host.IdentityKey;
#>
數據庫名:<#= host.DbName #>
數據庫類型:<#= host.DbType #>
表名:<#= host.TableName #>
表描述:<#= host.TableDescription #>
數據庫訪問類名:<#= host.DbHelperName #>
項目名稱:<#= host.ProjectName #>
存儲過程前綴:<#= host.ProcPrefix #>
類命名規則:<#= host.TabNameRule #>
數據庫DbType類名:<#= host.DbParaDbType #>
存儲過程參數符號:<#= host.preParameter #>
表集合:
<# foreach (TableInfo tab in host.TableList)
{
WriteLine(tab.TabName);
} #>
字段集合:
<# foreach (ColumnInfo c in host.Fieldlist)
{
WriteLine("public {0} {1} {{ get; set; }}",CodeCommon.DbTypeToCS(c.TypeName),c.ColumnName );
} #>
字段集合增加連接符號:
<#?for(int i=0;i< host.Keys.Count;i++)
{???ColumnInfo key = host.Keys[i]; #>
????<# if (key.IsPrimaryKey || !key.IsIdentity)
????{#>
?????????strSql.Append(" <#= key.ColumnName#> = <#=preParameter#><#=key.ColumnName#> <# if (i< host.Keys.Count-1 ) {#>and <#}#> ");
????<#}#>
<# }#>
主鍵字段集合集合:
<# foreach (ColumnInfo c in host.Keys)
{
WriteLine("public {0} {1} {{ get; set; }}",CodeCommon.DbTypeToCS(c.TypeName),c.ColumnName );
} #>
Model類名:<#=?host.GetModelClass(host.TableName) #>
BLL類名:<#=?host.GetBLLClass(host.TableName) #>
DAL類名:<#=?host.GetDALClass(host.TableName) #>
<#=?CodeCommon.DbParaDbType(host.DbType) #>
<#=?CodeCommon.preParameter(host.DbType) #>
<#=?CodeCommon.GetWhereParameterExpression(host.Keys,true,host.DbType) #>
<#=?CodeCommon.GetPreParameter(host.Keys,true,host.DbType) #>
<#=?CodeCommon.GetInParameter(host.Keys,true) #>
<#=?CodeCommon.GetFieldstrlist(host.Keys,true) #>
<#=?CodeCommon.GetWhereExpression(host.Keys,true) #>
.
總結
- 上一篇: SQL Server 数据库部分常用语句
- 下一篇: 让步的人,最值得深交