南京千里独行版权所有,转载请保存版权声明
绝大多数.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的表结构自动生成如下代码。
由于本人对数据库编程搞的不多,没有若干年的数据库编程工作经验,其中一些处理数据库的思想可能比较幼稚,望高手指点。