這裡的 KeyProperties,KeyParameterNames和myWhereSQL的值都在生成FillDeleteCommand時已經設 置好了,這裡直接拿來用。若KeyPropertIEs沒有內容,說明實體類型沒有指明綁定了關鍵字 段的屬性,此時無法生成更新時的查詢語句,於是輸出拋出異常的C#代碼文本。
我們 首先遍歷實體類型中所有的綁定了字段的屬性對象,拼湊出“Update TableName Set 字段名1=@Value屬性名1 , 字段名2=@Value屬性名2”(若未啟用命名參數則輸出為 “Update TableName Set 字段名1=? , 字段名2=?”)樣式的SQL文本,然後加上 myWhereSQL中的查詢條件文本,從而得出了完整的SQL語句,然後將其輸出到代碼文本中。
我們有一次遍歷實體類型所有綁定了字段的屬性對象,對於每一個屬性輸出添加SQL 參數對象的C#代碼文本。此外還遍歷KeyPropertIEs來生成添加查詢條件SQL參數的C#代碼文 本。
函數最後返回添加的SQL參數個數的返回語句。
生成完整的C#源代碼文本
在實現了生成讀取數據,插入數據,刪除數據和更新數據的代碼文本的程序代碼後, 我們就可以實現完整的生成C#代碼文本的程序代碼了,這些程序代碼就是方法GenerateCode 的全部內容,其代碼為
private string GenerateCode( string nsName , string strFileName , System.Collections.ArrayList RecordTypes )
{
// 開始創建代碼
IndentTextWriter myWriter = new IndentTextWriter();
myWriter.WriteLine("using System;");
myWriter.WriteLine("using System.Data;");
myWriter.WriteLine ("namespace " + nsName);
myWriter.BeginGroup("{");
// 對每一個數據容器對象創建數據處理類的代碼
foreach (Type RecordType in RecordTypes)
{
string TableName = RecordType.Name;
BindTableAttribute ta = (BindTableAttribute)Attribute.GetCustomAttribute(
RecordType, typeof(BindTableAttribute), false);
if (ta != null)
{
TableName = ta.Name;
}
if (TableName == null || TableName.Trim().Length == 0)
{
TableName = RecordType.Name;
}
TableName = TableName.Trim();
System.Reflection.PropertyInfo[] ps = this.GetBindPropertIEs(RecordType);
myWriter.WriteLine("public class " + RecordType.Name + "ORMHelper : " + typeof(RecordORMHelper).FullName);
myWriter.BeginGroup("{");
myWriter.WriteLine("");
myWriter.WriteLine("///<summary>創建對象</summary>");
myWriter.WriteLine("public " + RecordType.Name + "ORMHelper(){}");
myWriter.WriteLine("");
生成 重載TableName的代碼
生成重載RecordFIEldNames的代碼
生成重載 FillUpdateCommand的代碼
生成重載FillDeleteCommand的代碼
生成重載 FillInsertCommand的代碼
生成重載InnerReadRecord的代碼
}//foreach
myWriter.EndGroup("}//namespace");
// 若需要保存臨時生成的C#代碼到指定的文件
if (strFileName != null && strFileName.Length > 0)
{
myWriter.WriteFile(strFileName, System.Text.Encoding.GetEncoding(936));
}
return myWriter.ToString();
}
這個函數 的參數是生成的代碼的名稱空間的名稱,保存代碼文本的文件名和要處理的數據庫實體對象 類型列表。在函數中首先創建一個myWriter的代碼文本書寫器,輸出導入名稱空間的代碼文 本,輸出命名空間的代碼文本,然後遍歷RecordTypes列表中的所有的實體對象類型,對每一 個實體對象類型輸出一個定義類的C#代碼文本,類名就是 類型名稱+ORMHelper,該類繼承自 RecordORMHelper類型。然後執行上述的生成TableName,RecordFIEldNames, FillUpdateCommand,FillDelteCommand,FillInsertCommand和InnerReadRecord的C#代碼文 本的過程,這樣就完成了針對一個實體對象類型的C#代碼的生成過程。
當代碼生成器 完成工作後,內置的代碼文本書寫器myWriter中就包含了完整的C#代碼文本。這個代碼文本 中包含了多個從RecordORMHelper類型派生的數據庫操作幫助類型。這樣我們就可以隨即展開 動態編譯的操作了。