CYQ.Data 轻量数据访问层(三) 构造数据单元(下)

继上一节,回头看这张图片:

回顾上节的话题,怎么设计这样一个数据单元类?才不会有重复的单元表头,又能合理解释出数据与表头的关系?

经过长久的深思后。。一个关键的字出来了"ref",引用,是的,用的这就个,如果每个单元格,都包括值和单元表头,而单元表头,都引用同一个的时候,就刚好满足了需求。

 

 

于是,我们开始写出这样的类:

先构造出一个存放值的类:


/// <summary>
    /// 只包函被填充的数据状态和值
    /// </summary>
    public class MDataCellValue
    {
        /// <summary>
        /// //值是否为空
        /// </summary>
        internal bool _IsNull;
        /// <summary>
        /// 值是否被改变了
        /// </summary>
        internal bool _IsChange;
        /// <summary>
        /// 值是多少
        /// </summary>
        internal object _Value;

        public MDataCellValue()
        {
            _IsNull = true;
            _IsChange = false;
            _Value = null;
        }
    }

 

 

接着,我们构造存放表头:

我们可以参考数据库,也可以参考DataCell中的数据结构,构造出以下的类:


  /// <summary>
    /// 只包函数据库字段的属性
    /// </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 属性
        /// <summary>
        /// 数据字段列名称
        /// </summary>
        public string ColumnName
        {
            get
            {
                return this._ColumnName;
            }

        }

        /// <summary>
        /// 数据类型
        /// </summary>
        public System.Data.SqlDbType SqlType
        {
            get
            {
                return this._SqlType;
            }
        }

        /// <summary>
        /// 数据字段列是否为只读
        /// </summary>
        public bool IsReadOnly
        {
            get
            {
                return this._IsReadOnly;
            }
        }

        /// <summary>
        /// 数据字段列长度大小
        /// </summary>
        public int MaxSize
        {
            get
            {
                return this._MaxSize;
            }
        }

        /// <summary>
        /// 数据字段列值是否能为空
        /// </summary>
        public bool IsCanNull
        {
            get
            {
                return this._IsCanNull;
            }
        }
        /// <summary>
        /// 存储过程时用的参数
        /// </summary>
        public ParameterDirection ParaDirection
        {
            get
            {
                return this._ParaDirection;
            }
            set
            {
                _ParaDirection = (ParameterDirection)value;
            }
        }
        public string Operator
        {
            get
            {
                return _Operator;
            }
            set
            {
                _Operator = value;
            }
        }
        #endregion

    }

 

 

紧跟着,我们要开始构造单元格了,它包含了数据单元结构和值两个类,同时,为了让以后所有行的单元格里的表头都指向同一个,我们用出了"ref"

 


public class MDataCell
    {
        internal MDataCellValue _ValueContainer;
        private MDataCellStruct _DataStruct;
        构造函数

        初始化
    }

为了方便从数据单元里访问数据结构和值,我们通过增加属性来对外开放

 


 #region 属性

        字段结构
        /// <summary>
        /// 字段结构
        /// </summary>
        public MDataCellStruct DataStruct
        {
            get
            {
                return _DataStruct;
            }
        }

        /// <summary>
        /// 数据字段列值是否能改变
        /// </summary>
        public bool IsChange
        {
            get
            {
                return _ValueContainer._IsChange;
            }
            set
            {
                _ValueContainer._IsChange = value;
            }
        }

        /// <summary>
        /// 数据字段列值是否为空
        /// </summary>
        public bool IsNull
        {
            get
            {
                return _ValueContainer._IsNull;
            }
        }

        /// <summary>
        /// 数据字段列值
        /// </summary>
        public object Value
        {
            get
            {

                return _ValueContainer._Value;
            }
            set
            {

                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._Value = value;
                    _ValueContainer._IsChange = true;
                    _ValueContainer._IsNull = false;
                   
                }
            }
        }
         #endregion

 

至此,我们终于构造完数据单元格,当然了,在对Value的Set属性中,以后我们会加上数据类型的比较和数据长度的验证,来增加数据的安全性

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2009/11/06/1597719.html

时间: 2024-10-01 21:01:04

CYQ.Data 轻量数据访问层(三) 构造数据单元(下)的相关文章

CYQ.Data 轻量数据层之路 继续狂热升级(三)

在上一篇:CYQ.Data 轻量数据层之路 终极升级(二) 之时,我通过新增加GetFrom与SetTo方法,来避免直接使用索引的取值和赋值的不便.   本来,今天是打算写个实例教程,来简单介绍用这个超轻量框架进行开发是有多轻松的事情,不过在使用时,还是发现了个别的小bug. 于是,今天狂热的修改了N多代码,抽取Sql组成部分到单独的类中,继续去掉N多重载方法,留下最简洁最实用的方法.   以面看看有哪些改进: 数据库配置假设如下: <connectionStrings>         &l

CYQ.Data 轻量数据层之路 应用示例三 Aop切入留言系统--操作日志(二十七)

前言: 在8月份时,那时曾用CYQ.Data 1.2版本演示过一个完整的示例,留言版:详见:CYQ.Data 轻量数据层之路 应用示例一 留言版(四) 本篇将使用2.N系列版本,在不改动原来留言版系统一行代码的情况下,实现其数据库操作日志功能. 最新版本下载见:CYQ.Data 轻量数据层之路 bug反馈.优化建议.最新框架下载     正文步骤:   一:建表 1:增加一个日志操作表[ActionLogs],这个少不了,表结构如下: 2:创建表的数据库脚本如下: 创建ActionLogs表  

CYQ.Data 轻量数据层之路 使用篇三曲 MAction 取值赋值(十四)

上一篇:CYQ.Data 轻量数据层之路 使用篇二曲 MAction 数据查询(十三)   内容概要 本篇继续上一篇内容,本节介绍所有取值与赋值的相关操作.1:原生:像操作Row一样 2:扩展:对UI操作 GetFrom与SetTo 3:扩展:非UI操作 Get与Set   代码共同部分提前说明,我们假设以通过以下方法查询完一行数据 MAction action = new MAction(TableNames.Users);if (action.Fill("UserName='路过秋天'&qu

CYQ.Data 轻量数据层之路 V3.0版本发布-Xml绝对杀手(三十二)

前言: 继正式发布V2.0到现在,已30来天了,一直静悄悄的都没发布什么版本 中间仅有插播了一下:CYQ.Data 轻量数据层之路 V2.5 抢先体验版本功能说明演示 (二十九)   只因最近花了很多时间在重构一个以前的博客,目前已完成其基础功能,不日将发布相关文章. 提前预览网址:http://www.cyqdata.com/     本次版本升级内容大体说明: 1:Access应用调整2:修正对:uniqueidentifier.ntext.text.Image等几个类型的应用.3:扩展缓存

CYQ.Data 轻量数据层之路 抢先体验版本功能说明演示 (二十九)

本系列所有文章索引:CYQ.Data 轻量数据层之路 框架开源系列 索引 本系列所有相关下载:CYQ.Data 轻量数据层之路 bug反馈.优化建议.最新框架下载 前言:   一直都是发布版本才写文章,这次为抢先体验版本[V2.5]做一下简单的功能介绍   以下进行功能更新说明[相比V2.0版本]: 1:修正DebugInfo属性在异常发生时无法取得操作语句的问题 2:MAction增加Bind方法可以轻松绑定DropDownList等控件 3:MDataTable增加ToList<T>泛型方

CYQ.Data 轻量数据层之路 优雅V1.4 现世 附API帮助文档(九)

继上一版本V1.3版本发布到现在,时隔N天了:[V1.3版本开源见:CYQ.Data 轻量数据层之路 华丽V1.3版本 框架开源]   N天的时间,根据各路网友的反映及自身的想法,继续修改优化着本框架,力求让大伙相对满意: 对于:bug反馈.优化建议.及最新框架版本下载见:CYQ.Data 轻量数据层之路 bug反馈/优化建议/框架下载 升级说明: 本次升级只是针对易用性增加功能或优化代码及方法,并未发现V1.3版本存在任何bug, 因此,对于V1.3版本,大伙可放心使用,同时也已开放源码. 若

CYQ.Data 轻量数据层之路 自定义MDataTable绑定续章(七)

本章起,将续章讲解整框架当初的设计思路: 本章既为续章,说明我以前写过,是的,以前我写过内部整个MDataTable的构造,不过,当初匆匆写完后, 最后一步的实现MDataTable绑定GridView/DataList/Repeater还差一点,这章续上! 这里列出我以前写过的关于构造自定义MDataTable系列文章: 备注:以下内容为早期所写,文字少,代码多,有不明之处,欢迎在文章后面留言!   1:CYQ.Data 轻量数据访问层(二) 构造数据单元(上) 2:CYQ.Data 轻量数据

CYQ.Data 轻量数据层之路 V4.5 版本发布[更好的使用体验,更优的缓存机制]

前言: 继上一版本:CYQ.Data 轻量数据层之路 V4.3 版本发布[增加对SQLite,MySQL数据库的支持] ,至今已快近3个月了,中间仅有V4.5beta版本供下载,却没正式发布,今天,终于要把V4.5给发布了.   下面看一下新版本的修改记录 实用: 1:MAction:Select方法增加重载:Select(string where); 2:FormatWhere处理了"Parent is null"的"is"关键字;处理"order by

CYQ.Data 轻量数据层之路 华丽V1.3版本 框架开源

本篇对框架开源进行说明:   提前说明: 1:最近有很多友人没有留言就加群了,导致被拒绝,这此说声抱歉啦.    不过规则还是要遵守的,毕竟人数有限.    如果只是想着可有可无的看,下面有一份反编绎源码,基本也不影响高手查看了. 2:另外也有个别留了言没加群的,也只能说声音抱歉了,源码不会发到指定的邮箱.    源码会发送到指定邮箱的情况:仅限于公司名义,同时站内信有消息,才会特别去发邮件的.       本次开源针对最新版本V1.3版本,相关更新见:CYQ.Data 轻量数据层之路 华丽升级

CYQ.Data 轻量数据层之路 使用篇二曲 MAction 数据查询(十三)

上一篇:CYQ.Data 轻量数据层之路 使用篇一曲 裸身走天涯(十二)   前言说明: 本篇继续上一篇内容,本节介绍所有相关查询的使用. 主要内容提要:1:单行数据操作 Fill 操作 GetCount操作.2:多行数据操作 Select 操作3:列表绑定控件操作 配合分页控件4:多表查询及绑定 视图及自定义SQL     单行数据操作   一:Fill 填充方法,单行查询 方法原形:public bool Fill(object where) 示例1:直传ID MAction action