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

ORM 框架核心讀寫實作:InnerReadValues 資料映射與 InsertObjects 批次新增機制 (第 11 講下第 1 部分)

     編輯:關於C語言

InnerReadValues 逐欄位填充實體


private int InnerReadValues(object obj, TableBindInfo info, IDataReader reader)
{
    if (obj == null) throw new ArgumentNullException("obj");
    if (info == null) throw new ArgumentNullException("info");
    if (reader == null) throw new ArgumentNullException("reader");

    int count = 0;
    foreach (FieldBindInfo f in info.Fields)
    {
        if (!f.Property.CanWrite) continue; // 唯讀屬性跳過
        if (f.FieldIndex < 0) continue; // 查詢結果無此欄位
        object val = reader.GetValue(f.FieldIndex);
        val = f.FromDataBase(val); // 型別轉換/格式化
        f.Property.SetValue(obj, val, null);
        count++;
    }
    return count;
}

ReadObjects 完整查詢流程

  • 建立命令、執行查詢取得 IDataReader。
  • 取得 TableBindInfo、建立欄位索引映射 (FieldIndex)。
  • 迴圈 reader.Read():Activator.CreateInstance 建立實例 → InnerReadValues 填充 → 加入列表。
  • 達 MaxObjectCount 中斷,關閉 Reader,回傳物件陣列。

Contains 方法

額外提供 Contains 判斷實體對應的資料庫記錄是否存在 (內部執行 SELECT COUNT(*))。

InsertObjects 批次新增 (摘要)

參考第 2 部分 (ID 81311) 完整實作:動態拼裝 INSERT SQL、參數化、SQL 快取重用命令物件、逐筆執行並累計筆數。

核心設計模式

  • 反射驅動:運行期掃描特性建立映射元資料。
  • 元資料快取:Hashtable 快取 TableBindInfo 避免重複反射。
  • 參數化 SQL:統一防注入、型別安全。
  • 轉換封裝:FieldBindInfo.ToDataBase/FromDataBase 統一處理格式化與型別轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved