一种数据库结构体模式讨论

南京千里独行版权所有,转载请保存版权声明

    绝大多数.NET开发人员都搞过数据库开发,我也搞过,数据库操作中最常见的就是数据库表的访问,使用SQL语句查询数据表,读取数据,并向数据表新增修改和删除记录。为了说明问题,在此我定一个数据表UserTable,其字段为

UserID   字符串类型 用户编号 ,关键字
UserName 字符串类型 用户姓名
Password 字符串类型 密码
RegTime  字符串类型 用户注册时间,保存格式为YYYYMMDDHHmmss,有14个字符
LoginCount 整数类型 登录次数

    很多人采用数据库结构体的模式来处理数据库,也就是定义一个结构体或类,该对象的成员变量或属性和数据库的字段一一对应。对于表UserTable定出的数据库结构体可能为

class UserTableStruct
{
    public string UserID ;
    public string UserName ;
    public string Password ;
    public string( 或 DateTime ) RegTime ;
    public int LoginCount ;

    public static string GetSelectSQL()
    { return "Select UserID , UserName , Password , RegTime From UserTable ";}
}

    这样从数据表UserTable读取的数据就保存在类UserTableStruct中。其实VS.NET的数据集DataSet也是这种思想,VS.NET可以根据某张数据表,解析表结构,然后自动生成数据表结构体的代码,只是这个结构体从System.Data.DataRow派生的。

        数据库结构体的思想是不错的,只要数据库表结构定下来了,则结构体的代码也就好写了,非常适用于使用某某代码生成器来生成结构体代码。想想若有上百个表,几千个字段,几秒钟内自动生成上万行没有错误的代码,爽。

      同一种设计思想会产生很多种模式,基于DataSet模式应该是使用最多的模式了,因为它有VS.NET开发环境的支持。

        本人研究过Cache'数据库,这个面向对象的数据库蛮好的,我使用VB利用它提供的Com接口来访问数据库,该COM接口已经实现了这种数据库结构体的思想,能根据数据库结构自动生成相适应的COM对象,然后我用VB的能后期绑定的特性来使用COM对象来存取数据。当Cache'数据库表字段不是基础数据类型,而是某种对象时则此时COM对象的表示数据库字段的属性就是一个Cache'对象,该对象有自己的成员。例如表UserTable新增大文本型字段UserContent,则在VB中使用 obj.UserContent.data 返回该大字段中所有的字符串数据,使用obj.UserContent.write书写数据,这种思想也不错。

      虽然有很多数据库结构体模式存在,但我一向喜欢研究别人的造出自己的。在此我提出一种新的模式。

      在这个模式下所有的字段都是对象类型,定义一个字段基础类型DBFieldBase ,该类型定义几个虚方法来提供所有字段的共同接口。然后针对不同类型的字段来从DBFieldBase派生实际使用的类型,比如根据整数类型的字段派生DBIntegerField,根据字符串类型字段派生DBStringField ,根据有14个字符的表示时间的字符串派生DB14DBDateField。如此这般把所有类型的字段对应的DBFieldBase派生类给定义好。一个应用中数据库字段可以有很多个,但字段类型有限,完全可以全部定义出来。

    接着定义数据库表记录结构体的基础类型 DBRecordBase ,该类型定义了所有的数据库记录的基本操作和接口。内部定义了字段对象数组。然后根据每个数据表从DBRecordBase派生一个新的类型,比如从UserTable表派生DBUserTable类型,该类型在初始化的时候就初始化字段对象数组。针对每个字段的类型使用不同的DBFieldBase派生类。

    有时候我们需要对多条数据进行操作,于是定义一个DBRecordCollectionBase ,该类型从System.Colleciton.CollectionBase派生的,用于管理多条数据库记录。

   根据这些设计我编制了基础性的代码,也就是支持本模式的类库了,这些代码比较长,单击此处显示

   这些基础搭建完毕后可以根据数据表结构来生成各种结构体代码了。我自己做了个代码生成器,根据UserTable的表结构自动生成如下代码。
   由于本人对数据库编程搞的不多,没有若干年的数据库编程工作经验,其中一些处理数据库的思想可能比较幼稚,望高手指点。


//*************************************************************************************************
//  文件名 USERTABLE.cs 
//*************************************************************************************************
/// <summary>
/// 数据库表 USERTABLE [用户表] 操作对象 , 该表有5个字段 关键字段 UserID
/// </summary>

public class DB_USERTABLE : DBRecordBase
{   
    
#region 定义字段类型 **********************************************************************
    
    
// 用户编号      字段 UserID      类型:varchar(20) 关键字段
    internal class DB_USERTABLE_UserID : DBStringField 
    
{
        
public override string FieldNamegetreturn "USERID" ; } }
        
public override bool KeyFieldgetreturn true;}} 
    }

    
// 用户姓名      字段 UserName    类型:varchar(20)
    internal class DB_USERTABLE_UserName : DBStringField 
    
{
        
public override string FieldNamegetreturn "USERNAME" ; } }
    }

    
// 密码          字段 Password    类型:varchar(20)
    internal class DB_USERTABLE_Password : DBStringField 
    
{
        
public override string FieldNamegetreturn "PASSWORD" ; } }
    }

    
// 用户注册时间  字段 RegTime     类型:varchar(14)
    internal class DB_USERTABLE_RegTime : DB14DBDateField 
    
{
        
public override string FieldNamegetreturn "REGTIME" ; } }
    }

    
// 登录次数      字段 LoginCount  类型:int()
    internal class DB_USERTABLE_LoginCount : DBIntegerField 
    
{
        
public override string FieldNamegetreturn "LOGINCOUNT" ; } }
    }

    
    
#endregion

    
    
    
#region 定义字段类型 **********************************************************************
    
    
    
/// <summary>
    
/// 用户编号 UserID [关键字段]
    
/// </summary>

    public string mUserID
    
{
        
getreturn ( ( DBStringField ) myFields[ 0 ] ).StringValue ; }
        
set{ ( ( DBStringField ) myFields[ 0 ] ).StringValue = value; }
    }

    
    
/// <summary>
    
/// 用户姓名 UserName
    
/// </summary>

    public string mUserName
    
{
        
getreturn ( ( DBStringField ) myFields[ 1 ] ).StringValue ; }
        
set{ ( ( DBStringField ) myFields[ 1 ] ).StringValue = value; }
    }

    
    
/// <summary>
    
/// 密码 Password
    
/// </summary>

    public string mPassword
    
{
        
getreturn ( ( DBStringField ) myFields[ 2 ] ).StringValue ; }
        
set{ ( ( DBStringField ) myFields[ 2 ] ).StringValue = value; }
    }

    
    
/// <summary>
    
/// 用户注册时间 RegTime
    
/// </summary>

    public System.DateTime mRegTime
    
{
        
getreturn ( ( DB14DBDateField ) myFields[ 3 ] ).DateTimeValue ; }
        
set{ ( ( DB14DBDateField ) myFields[ 3 ] ).DateTimeValue = value; }
    }

    
    
/// <summary>
    
/// 登录次数 LoginCount
    
/// </summary>

    public int mLoginCount
    
{
        
getreturn ( ( DBIntegerField ) myFields[ 4 ] ).IntegerValue ; }
        
set{ ( ( DBIntegerField ) myFields[ 4 ] ).IntegerValue = value; }
    }

    
    
#endregion



    
/// <summary>
    
/// 已重载:获得数据表名称
    
/// </summary>
    
/// <returns>表的名称</returns>

    public override string TableName
    
{
        
getreturn "USERTABLE"; }
    }

    
    
/// <summary>
    
/// 已重载:创建一个对象实例,对象类型为 DB_USERTABLE
    
/// </summary>
    
/// <returns>创建的对象的实例</returns>

    public override DBRecordBase NewInstance() 
    
{
        
return new DB_USERTABLE() ;
    }

    
    
    
// 初始化对象
    public DB_USERTABLE()
    
{
        myFields 
= new DBFieldBase[ 5 ] ;
        
        myFields[ 
0  ] = new DB_USERTABLE_UserID();      // 用户编号      字段 UserID      类型:varchar(20) 关键字段
        myFields[ 1  ] = new DB_USERTABLE_UserName();    // 用户姓名      字段 UserName    类型:varchar(20)
        myFields[ 2  ] = new DB_USERTABLE_Password();    // 密码          字段 Password    类型:varchar(20)
        myFields[ 3  ] = new DB_USERTABLE_RegTime();     // 用户注册时间  字段 RegTime     类型:varchar(14)
        myFields[ 4  ] = new DB_USERTABLE_LoginCount();  // 登录次数      字段 LoginCount  类型:int() 
        foreach( DBFieldBase f in myFields )
            f.OwnerRecord 
= this ;
    }

    
}
// 数据库操作类 DB_USERTABLE 定义结束

/// <summary>
/// 数据库表 USERTABLE [用户表] 操作对象集合
/// </summary>

public class USERTABLECollection : DBRecordCollectionBase
{
    
private DB_USERTABLE myRecord ;

    
/// <summary>
    
/// 已重载:返回指定序号的数据库记录对象
    
/// </summary>

    public DB_USERTABLE this[int index]
    
{
        
getreturn ( DB_USERTABLE ) base.InnerList[index] ;}
    }


    
protected override bool SetSelectCommand(System.Data.IDbCommand myCmd)
    
{
        myCmd.CommandText 
= myRecordInstance.GetSelectSQL() ;
        
return true;
    }

    
///<summary>
    
/// 初始化对象
    
///</summary>

    public USERTABLECollection()
    
{
        myRecord 
= new DB_USERTABLE();
        myRecordInstance 
= myRecord ;
    }

}
//public class USERTABLECollection : DBRecordCollectionBase
posted @ 2006-01-22 18:29  torome  阅读(402)  评论(0编辑  收藏  举报