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

C# 發現之旅第十二講:基於反射與動態編譯的快速 ORM 框架(下)─ 更新命令生成詳解

     編輯:關於C語言

前言

在快速 ORM 框架中,FillUpdateCommand 方法負責為資料庫更新操作建立 SQL 命令與參數。本文將深入解析代碼生成器如何透過反射動態產生此方法的 C# 程式碼,涵欋參數驗證、SQL 組裝、參數綁定等核心邏輯。

代碼生成器核心邏輯

生成器使用 IndentTextWriter 輸出格式化的程式碼。首先進行參數檢查:

if (cmd == null) throw new ArgumentNullException("cmd");
if (objRecord == null) throw new ArgumentNullException("objRecord");

接著將傳入的 object 強制轉型為實體類型(如 DB_Employees),若轉型失敗則拋出異常。

SQL 語句動態組裝

更新語句的 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 處理值賦予:

  • DateTime:依 BindFieldAttribute.WriteFormat 格式化,預設 yyyy-MM-dd HH:mm:ss。
  • string:若為 null 或空字串,設為 DBNull.Value。
  • 其他類型:直接指派屬性值。

最後回傳參數總數,供框架驗證。

完整生成代碼範例

針對 DB_Employees,生成的 FillUpdateCommand 會包含所有欄位的參數綁定,並在最後補上主鍵 EmployeeID 作為 WHERE 條件參數,確保更新精準定位單筆記錄。

小結

透過反射掃描屬性與屬性標記,代碼生成器能自動產出強型別、參數化的更新命令,避免手寫 SQL 的錯誤與維護成本,展現動態編譯 ORM 的強大靈活性。

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