程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(下)(7)

C#發現之旅第十二講 基於反射和動態編譯的快速ORM框架(下)(7)

編輯:關於C語言

這裡的 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類型派生的數據庫操作幫助類型。這樣我們就可以隨即展開 動態編譯的操作了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved