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;
}
IDataReader。TableBindInfo、建立欄位索引映射 (FieldIndex)。reader.Read():Activator.CreateInstance 建立實例 → InnerReadValues 填充 → 加入列表。MaxObjectCount 中斷,關閉 Reader,回傳物件陣列。額外提供 Contains 判斷實體對應的資料庫記錄是否存在 (內部執行 SELECT COUNT(*))。
參考第 2 部分 (ID 81311) 完整實作:動態拼裝 INSERT SQL、參數化、SQL 快取重用命令物件、逐筆執行並累計筆數。
Hashtable 快取 TableBindInfo 避免重複反射。FieldBindInfo.ToDataBase/FromDataBase 統一處理格式化與型別轉換。