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

ORM 框架更新邏輯:動態拼裝 UPDATE SET 子句與關鍵欄位條件建構 (第 11 講下第 3 部分)

     編輯:關於C語言

UpdateObjects 核心實作

public int UpdateObjects(IEnumerable objects)
{
    if (objects == null) throw new ArgumentNullException("objects");
    CheckBindInfo(objects, true); CheckConnection();

    int count = 0;
    using (IDbCommand cmd = conn.CreateCommand())
    {
        foreach (object obj in objects)
        {
            TableBindInfo table = GetBindInfo(obj.GetType());
            ArrayList values = new ArrayList();
            StringBuilder sql = new StringBuilder();

            // 建構 SET 子句
            foreach (FieldBindInfo f in table.Fields)
            {
                object val = f.Property.GetValue(obj, null);
                if (sql.Length > 0) sql.Append(",\n");
                sql.Append($"{FixFieldName(f.FieldName)} = ?");
                values.Add(f.ToDataBase(val));
            }
            sql.Insert(0, $"UPDATE {FixTableName(table.TableName)} SET ");

            // 建構 WHERE 子句
            string where = BuildCondition(obj, values); // 同 DeleteObjects
            sql.Append($" WHERE {where}");

            // 執行
            cmd.Parameters.Clear();
            cmd.CommandText = sql.ToString();
            foreach (object v in values)
            {
                IDbDataParameter p = cmd.CreateParameter();
                cmd.Parameters.Add(p); p.Value = v;
            }
            count += cmd.ExecuteNonQuery();
        }
    }
    return count;
}

關鍵設計

  • 所有可寫屬性 (含非關鍵欄位) 皆納入 SET 子句,關鍵欄位同時用於 WHERE。
  • 參數化 SQL:SET 與 WHERE 參數合併於同一 values 列表,順序與 SQL 佔位符對應。
  • BuildCondition 重用刪除邏輯,確保 WHERE 條件一致性。
  • 同樣採用 strLastSQL 快取機制 (略) 減少重複設定 CommandText/Parameters 開銷。

介面豐富化

在 UpdateObjects 基礎上衍生單一物件更新、指定表名更新等多載方法,豐富框架 API。

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