天天看點

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

繼上一節,回頭看這張圖檔:

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

回顧上節的話題,怎麼設計這樣一個資料單元類?才不會有重複的單元表頭,又能合了解釋出資料與表頭的關系?

經過長久的深思後。。一個關鍵的字出來了"ref",引用,是的,用的這就個,如果每個單元格,都包括值和單元表頭,而單元表頭,都引用同一個的時候,就剛好滿足了需求。

于是,我們開始寫出這樣的類:

先構造出一個存放值的類:

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

/// <summary>

    /// 隻包函被填充的資料狀态和值

    /// </summary>

    public class mdatacellvalue

    {

        /// <summary>

        /// //值是否為空

        /// </summary>

        internal bool _isnull;

        /// 值是否被改變了

        internal bool _ischange;

        /// 值是多少

        internal object _value;

        public mdatacellvalue()

        {

            _isnull = true;

            _ischange = false;

            _value = null;

        }

    }

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

接着,我們構造存放表頭:

我們可以參考資料庫,也可以參考datacell中的資料結構,構造出以下的類:

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

  /// <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;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

緊跟着,我們要開始構造單元格了,它包含了資料單元結構和值兩個類,同時,為了讓以後所有行的單元格裡的表頭都指向同一個,我們用出了"ref"

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

public class mdatacell

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        internal mdatacellvalue _valuecontainer;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        private mdatacellstruct _datastruct;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        public mdatacell(ref mdatacellstruct datastruct)

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

            init(ref datastruct, null);

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        public mdatacell(ref mdatacellstruct datastruct, object value)

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

            init(ref datastruct, value);

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        #region 初始化

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        private void init(ref mdatacellstruct datastruct, object value)

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

            _valuecontainer = new mdatacellvalue();

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

            _datastruct = datastruct;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

            _valuecontainer._value = value;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

為了友善從資料單元裡通路資料結構和值,我們通過增加屬性來對外開放

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

 #region 屬性

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        字段結構

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        /// 字段結構

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        public mdatacellstruct datastruct

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                return _datastruct;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        /// 資料字段列值是否能改變

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        public bool ischange

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                return _valuecontainer._ischange;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                _valuecontainer._ischange = value;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        /// 資料字段列值是否為空

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        public bool isnull

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                return _valuecontainer._isnull;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        /// 資料字段列值

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

        public object value

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                return _valuecontainer._value;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                if (_datastruct._iscannull)//資料庫允許為null值

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                {

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                    _valuecontainer._value = value;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                    _valuecontainer._ischange = true;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                    _valuecontainer._isnull = (value == null || value == dbnull.value);

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                }

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                else if (value != null && value != dbnull.value)//資料庫不允許為null值不允許為null值

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

                    _valuecontainer._isnull = false;

CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)
CYQ.Data 輕量資料通路層(三) 構造資料單元(下)

         #endregion

至此,我們終于構造完資料單元格,當然了,在對value的set屬性中,以後我們會加上資料類型的比較和資料長度的驗證,來增加資料的安全性