FillUpdateCommand 代碼生成過程中,KeyProperties、KeyParameterNames、myWhereSQL 均在生成 FillDeleteCommand 階段已備妥,此處直接複用。若實體類型未標記任何鍵屬性(KeyProperties.Count == 0),無法構建 WHERE 條件,生成器會輸出拋出 NotSupportedException 的程式碼,而非即時拋出異常,保留框架對「唯讀/僅新增」實體的支援彈性。
生成器分兩輪遍歷綁定屬性:第一輪拼裝 UPDATE Table SET Col1=@Val1, Col2=@Val2... 片段(若未啟用命名參數則用 ? 佔位符),再附加 myWhereSQL 形成完整 SQL;第二輪針對所有綁定屬性與鍵屬性輸出 cmd.CreateParameter() 及參數值設定碼。最後輸出參數總數的 return 陳述式。
所有 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 的具體類別,隨即可交由動態編譯器處理。