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

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

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

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

 

 

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

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

05233721_TkYO.gif
///   <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中的数据结构,构造出以下的类:

05233721_TkYO.gif
   ///   <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"

 

05233721_1hAW.gif 05233721_eLXW.gif Code
public class MDataCell
05233721_eLXW.gif05233721_1hAW.gif    
{
        
internal MDataCellValue _ValueContainer;
        
private MDataCellStruct _DataStruct;
05233721_GyTI.gif05233721_1Nia.gif        
构造函数#region 构造函数
        
public MDataCell(ref MDataCellStruct dataStruct)
05233721_1Nia.gif05233721_GyTI.gif        
{
            Init(
ref dataStruct, null);
        }


        
public MDataCell(ref MDataCellStruct dataStruct, object value)
05233721_1Nia.gif05233721_GyTI.gif        
{
            Init(
ref dataStruct, value);
        }


        
#endregion

05233721_GyTI.gif05233721_1Nia.gif        
初始化#region 初始化
        
private void Init(ref MDataCellStruct dataStruct, object value)
05233721_1Nia.gif05233721_GyTI.gif        
{
            _ValueContainer 
= new MDataCellValue();
            _DataStruct 
= dataStruct;
            _ValueContainer._Value 
= value;
        }

        
#endregion
    }

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

 

05233721_1hAW.gif 05233721_eLXW.gif Code
05233721_1hAW.gif05233721_eLXW.gif 属性#region 属性

05233721_GyTI.gif05233721_1Nia.gif        
字段结构#region 字段结构
05233721_1Nia.gif05233721_GyTI.gif        
/**//// <summary>
        
/// 操作符
        
/// </summary>
        public string Operator
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct._Operator;
            }

            
set
05233721_1Nia.gif05233721_GyTI.gif            
{
                _DataStruct._Operator 
= value;
            }

        }

        
public ParameterDirection ParaDirection
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct._ParaDirection;
            }

            
set
05233721_1Nia.gif05233721_GyTI.gif            
{
                _DataStruct._ParaDirection 
= (ParameterDirection)value;
            }

        }

        
public string ColumnName
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct._ColumnName;
            }

        }


        
public SqlDbType SqlType
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct._SqlType;
            }

        }

        
public int MaxSize
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct._MaxSize;
            }

        }

        
public bool IsCanNull
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct._IsCanNull;
            }

        }

        
public bool IsReadOnly
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct._IsReadOnly;
            }

        }

        
#endregion
05233721_1Nia.gif05233721_GyTI.gif        
/**//// <summary>
        
/// 字段结构
        
/// </summary>
        public MDataCellStruct DataStruct
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _DataStruct;
            }

        }


05233721_1Nia.gif05233721_GyTI.gif        
/**//// <summary>
        
/// 数据字段列值是否能改变
        
/// </summary>
        public bool IsChange
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{
                
return _ValueContainer._IsChange;
            }

            
set
05233721_1Nia.gif05233721_GyTI.gif            
{
                _ValueContainer._IsChange 
= value;
            }

        }


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

        }


05233721_1Nia.gif05233721_GyTI.gif        
/**//// <summary>
        
/// 数据字段列值
        
/// </summary>
        public object Value
05233721_1Nia.gif05233721_GyTI.gif        
{
            
get
05233721_1Nia.gif05233721_GyTI.gif            
{

                
return _ValueContainer._Value;
            }

            
set
05233721_1Nia.gif05233721_GyTI.gif            
{

                
if (_DataStruct._IsCanNull)//数据库允许为null值
05233721_1Nia.gif05233721_GyTI.gif
                {
                    _ValueContainer._Value 
= value;
                    _ValueContainer._IsChange 
= true;
                    _ValueContainer._IsNull 
= (value == null || value == DBNull.Value);
                }

                
else if (value != null && value != DBNull.Value)//数据库不允许为null值不允许为null值
05233721_1Nia.gif05233721_GyTI.gif
                {
                    _ValueContainer._Value 
= value;
                    _ValueContainer._IsChange 
= true;
                    _ValueContainer._IsNull 
= false;
                   
                }

            }

        }

         
#endregion

 

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

转载于:https://my.oschina.net/secyaher/blog/274332

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值