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

ORM 框架元資料設計:TableBindInfo 與 FieldBindInfo 類別結構與格式化轉換 (第 11 講上第 6 部分)

     編輯:關於C語言

TableBindInfo - 資料表繫結資訊


private class TableBindInfo
{
    public string TableName;
    public Type ObjectType;
    public BindTableAttribute Attribute;
    public FieldBindInfo[] Fields;
    public string FieldNameList; // "欄位1,欄位2,欄位3"
}

FieldBindInfo - 欄位繫結資訊 (含轉換邏輯)


private class FieldBindInfo
{
    public string FieldName;
    public int FieldIndex = -1;
    public PropertyInfo Property;
    public Type ValueType;
    public object DefaultValue;
    public BindFieldAttribute Attribute;

    // 物件 → 資料庫 (寫入前轉換)
    public object ToDataBase(object v)
    {
        if (v == null || DBNull.Value.Equals(v)) return DBNull.Value;
        string fmt = Attribute.WriteFormat;
        if (!string.IsNullOrEmpty(fmt) && v is IFormattable)
            v = ((IFormattable)v).ToString(fmt, null);
        return v;
    }

    // 資料庫 → 物件 (讀取後轉換)
    public object FromDataBase(object v)
    {
        if (v == null || DBNull.Value.Equals(v)) return DefaultValue;
        string fmt = Attribute.ReadFormat;
        if (!string.IsNullOrEmpty(fmt))
        {
            string s = Convert.ToString(v);
            if (ValueType == typeof(DateTime))
                return fmt == null ? DateTime.Parse(s) : DateTime.ParseExact(s, fmt, null);
            if (ValueType == typeof(byte)) return byte.Parse(s);
            if (ValueType == typeof(short)) return short.Parse(s);
            if (ValueType == typeof(int)) return int.Parse(s);
            if (ValueType == typeof(float)) return float.Parse(s);
            if (ValueType == typeof(double)) return double.Parse(s);
            return Convert.ChangeType(s, ValueType);
        }
        // 無格式化:直接型別匹配或轉換
        if (v.GetType() == ValueType || v.GetType().IsSubclassOf(ValueType)) return v;
        var converter = TypeDescriptor.GetConverter(ValueType);
        if (converter != null && converter.CanConvertFrom(v.GetType()))
            return converter.ConvertFrom(v);
        return Convert.ChangeType(v, ValueType);
    }
}

設計亮點

  • FieldNameList 便於快速組裝 SQL 欄位清單。
  • ToDataBase/FromDataBase 封裝雙向格式化與型別轉換,支援 IFormattable、TypeConverter、Parse 多重策略。
  • DefaultValue 處理 DBNull → CLR 預設值。
  • 結構為私有類別,隱藏於框架內部,外部僅操作實體物件。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved