繼上一節,回頭看這張圖檔:
回顧上節的話題,怎麼設計這樣一個資料單元類?才不會有重複的單元表頭,又能合了解釋出資料與表頭的關系?
經過長久的深思後。。一個關鍵的字出來了"ref",引用,是的,用的這就個,如果每個單元格,都包括值和單元表頭,而單元表頭,都引用同一個的時候,就剛好滿足了需求。
于是,我們開始寫出這樣的類:
先構造出一個存放值的類:
/// <summary>
/// 隻包函被填充的資料狀态和值
/// </summary>
public class mdatacellvalue
{
/// <summary>
/// //值是否為空
/// </summary>
internal bool _isnull;
/// 值是否被改變了
internal bool _ischange;
/// 值是多少
internal object _value;
public mdatacellvalue()
{
_isnull = true;
_ischange = false;
_value = null;
}
}
接着,我們構造存放表頭:
我們可以參考資料庫,也可以參考datacell中的資料結構,構造出以下的類:
/// <summary>
/// 隻包函資料庫字段的屬性
public class mdatacellstruct
internal bool _iscannull;
internal bool _isreadonly;
internal string _columnname;
internal system.data.sqldbtype _sqltype;
internal int _maxsize;
internal string _operator = "=";
internal parameterdirection _paradirection;
#region 構造函數
public mdatacellstruct(string columnname, system.data.sqldbtype sqltype, bool isreadonly, bool iscannull, int maxsize, parameterdirection paradirection)
_columnname = columnname;
_sqltype = sqltype;
_isreadonly = isreadonly;
_iscannull = iscannull;
_maxsize = maxsize;
_paradirection = paradirection;
#endregion
#region 屬性
/// 資料字段列名稱
public string columnname
get
{
return this._columnname;
}
/// 資料類型
public system.data.sqldbtype sqltype
return this._sqltype;
/// 資料字段列是否為隻讀
public bool isreadonly
return this._isreadonly;
/// 資料字段列長度大小
public int maxsize
return this._maxsize;
/// 資料字段列值是否能為空
public bool iscannull
return this._iscannull;
/// 存儲過程時用的參數
public parameterdirection paradirection
return this._paradirection;
set
_paradirection = (parameterdirection)value;
public string operator
return _operator;
_operator = value;
緊跟着,我們要開始構造單元格了,它包含了資料單元結構和值兩個類,同時,為了讓以後所有行的單元格裡的表頭都指向同一個,我們用出了"ref"
public class mdatacell
internal mdatacellvalue _valuecontainer;
private mdatacellstruct _datastruct;
public mdatacell(ref mdatacellstruct datastruct)
init(ref datastruct, null);
public mdatacell(ref mdatacellstruct datastruct, object value)
init(ref datastruct, value);
#region 初始化
private void init(ref mdatacellstruct datastruct, object value)
_valuecontainer = new mdatacellvalue();
_datastruct = datastruct;
_valuecontainer._value = value;
為了友善從資料單元裡通路資料結構和值,我們通過增加屬性來對外開放
#region 屬性
字段結構
/// 字段結構
public mdatacellstruct datastruct
return _datastruct;
/// 資料字段列值是否能改變
public bool ischange
return _valuecontainer._ischange;
_valuecontainer._ischange = value;
/// 資料字段列值是否為空
public bool isnull
return _valuecontainer._isnull;
/// 資料字段列值
public object value
return _valuecontainer._value;
if (_datastruct._iscannull)//資料庫允許為null值
{
_valuecontainer._value = value;
_valuecontainer._ischange = true;
_valuecontainer._isnull = (value == null || value == dbnull.value);
}
else if (value != null && value != dbnull.value)//資料庫不允許為null值不允許為null值
_valuecontainer._isnull = false;
#endregion
至此,我們終于構造完資料單元格,當然了,在對value的set屬性中,以後我們會加上資料類型的比較和資料長度的驗證,來增加資料的安全性
版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/archive/2009/11/06/1597719.html