在快速 ORM 框架中,FillUpdateCommand 方法負責為資料庫更新操作建立 SQL 命令與參數。本文將深入解析代碼生成器如何透過反射動態產生此方法的 C# 程式碼,涵欋參數驗證、SQL 組裝、參數綁定等核心邏輯。
生成器使用 IndentTextWriter 輸出格式化的程式碼。首先進行參數檢查:
if (cmd == null) throw new ArgumentNullException("cmd");
if (objRecord == null) throw new ArgumentNullException("objRecord");
接著將傳入的 object 強制轉型為實體類型(如 DB_Employees),若轉型失敗則拋出異常。
更新語句的 SET 子句由所有可讀取的屬性組成,若啟用命名參數(bolNamedParameter),則產生 @ValuePropertyName 格式,否則使用 ? 佔位符:
foreach (PropertyInfo p in ps) {
if (!p.CanRead) continue;
string fieldName = GetBindFieldName(p);
if (sql.Length > 0) sql.Append(" , ");
if (bolNamedParameter) {
string pName = "Value" + p.Name;
paramNames.Add(pName);
sql.Append(FixFieldName(fieldName) + " = @" + pName);
} else {
sql.Append(FixFieldName(fieldName) + " = ? ");
}
}
主鍵參數名稱會加入 ParameterNames 列表,最後組合完整 SQL:
sql.Insert(0, "UPDATE " + FixTableName(tableName) + " SET ");
sql.Append(" WHERE " + whereSql.ToString());
生成的程式碼會依序為每個屬性建立 IDbDataParameter,並呼叫 WriteSetParameterValue 處理值賦予:
BindFieldAttribute.WriteFormat 格式化,預設 yyyy-MM-dd HH:mm:ss。DBNull.Value。最後回傳參數總數,供框架驗證。
針對 DB_Employees,生成的 FillUpdateCommand 會包含所有欄位的參數綁定,並在最後補上主鍵 EmployeeID 作為 WHERE 條件參數,確保更新精準定位單筆記錄。
透過反射掃描屬性與屬性標記,代碼生成器能自動產出強型別、參數化的更新命令,避免手寫 SQL 的錯誤與維護成本,展現動態編譯 ORM 的強大靈活性。