首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

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

     編輯:關於C語言

更新命令生成邏輯

FillUpdateCommand 代碼生成過程中,KeyProperties、KeyParameterNames、myWhereSQL 均在生成 FillDeleteCommand 階段已備妥,此處直接複用。若實體類型未標記任何鍵屬性(KeyProperties.Count == 0),無法構建 WHERE 條件,生成器會輸出拋出 NotSupportedException 的程式碼,而非即時拋出異常,保留框架對「唯讀/僅新增」實體的支援彈性。

SQL 語句與參數組裝

生成器分兩輪遍歷綁定屬性:第一輪拼裝 UPDATE Table SET Col1=@Val1, Col2=@Val2... 片段(若未啟用命名參數則用 ? 佔位符),再附加 myWhereSQL 形成完整 SQL;第二輪針對所有綁定屬性與鍵屬性輸出 cmd.CreateParameter() 及參數值設定碼。最後輸出參數總數的 return 陳述式。

完整 C# 原始碼生成流程

所有 CRUD 方法生成邏輯就緒後,GenerateCode 方法串聯完整輸出:

private string GenerateCode(string nsName, string strFileName, 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) {
        // 解析表名、屬性資訊
        // 輸出 "public class XxxORMHelper : RecordORMHelper"
        myWriter.BeginGroup("{");
        // 依序生成 6 個核心方法覆寫
        myWriter.EndGroup("}");
    }
    myWriter.EndGroup("}//namespace");
    if (!string.IsNullOrEmpty(strFileName))
        myWriter.WriteFile(strFileName, Encoding.GetEncoding(936));
    return myWriter.ToString();
}

產出的原始碼包含多個繼承 RecordORMHelper 的具體類別,隨即可交由動態編譯器處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved