南京千里独行版权所有,转载请保存版权声明
绝大多数.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的表结构自动生成如下代码。
由于本人对数据库编程搞的不多,没有若干年的数据库编程工作经验,其中一些处理数据库的思想可能比较幼稚,望高手指点。
![](/Images/OutliningIndicators/None.gif)
//*************************************************************************************************
// 文件名 USERTABLE.cs
//*************************************************************************************************
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
/// 数据库表 USERTABLE [用户表] 操作对象 , 该表有5个字段 关键字段 UserID
/// </summary>
public class DB_USERTABLE : DBRecordBase
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
定义字段类型 **********************************************************************#region 定义字段类型 **********************************************************************
// 用户编号 字段 UserID 类型:varchar(20) 关键字段
internal class DB_USERTABLE_UserID : DBStringField
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public override string FieldName
{ get
{ return "USERID" ; } }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public override bool KeyField
{ get
{ return true;}}
}
// 用户姓名 字段 UserName 类型:varchar(20)
internal class DB_USERTABLE_UserName : DBStringField
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public override string FieldName
{ get
{ return "USERNAME" ; } }
}
// 密码 字段 Password 类型:varchar(20)
internal class DB_USERTABLE_Password : DBStringField
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public override string FieldName
{ get
{ return "PASSWORD" ; } }
}
// 用户注册时间 字段 RegTime 类型:varchar(14)
internal class DB_USERTABLE_RegTime : DB14DBDateField
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public override string FieldName
{ get
{ return "REGTIME" ; } }
}
// 登录次数 字段 LoginCount 类型:int()
internal class DB_USERTABLE_LoginCount : DBIntegerField
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public override string FieldName
{ get
{ return "LOGINCOUNT" ; } }
}
#endregion
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
定义字段类型 **********************************************************************#region 定义字段类型 **********************************************************************
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 用户编号 UserID [关键字段]
/// </summary>
public string mUserID
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return ( ( DBStringField ) myFields[ 0 ] ).StringValue ; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ ( ( DBStringField ) myFields[ 0 ] ).StringValue = value; }
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 用户姓名 UserName
/// </summary>
public string mUserName
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return ( ( DBStringField ) myFields[ 1 ] ).StringValue ; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ ( ( DBStringField ) myFields[ 1 ] ).StringValue = value; }
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 密码 Password
/// </summary>
public string mPassword
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return ( ( DBStringField ) myFields[ 2 ] ).StringValue ; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ ( ( DBStringField ) myFields[ 2 ] ).StringValue = value; }
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 用户注册时间 RegTime
/// </summary>
public System.DateTime mRegTime
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return ( ( DB14DBDateField ) myFields[ 3 ] ).DateTimeValue ; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ ( ( DB14DBDateField ) myFields[ 3 ] ).DateTimeValue = value; }
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 登录次数 LoginCount
/// </summary>
public int mLoginCount
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return ( ( DBIntegerField ) myFields[ 4 ] ).IntegerValue ; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ ( ( DBIntegerField ) myFields[ 4 ] ).IntegerValue = value; }
}
#endregion
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 已重载:获得数据表名称
/// </summary>
/// <returns>表的名称</returns>
public override string TableName
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return "USERTABLE"; }
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 已重载:创建一个对象实例,对象类型为 DB_USERTABLE
/// </summary>
/// <returns>创建的对象的实例</returns>
public override DBRecordBase NewInstance()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return new DB_USERTABLE() ;
}
// 初始化对象
public DB_USERTABLE()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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 定义结束
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <summary>
/// 数据库表 USERTABLE [用户表] 操作对象集合
/// </summary>
public class USERTABLECollection : DBRecordCollectionBase
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
{
private DB_USERTABLE myRecord ;
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
/// 已重载:返回指定序号的数据库记录对象
/// </summary>
public DB_USERTABLE this[int index]
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return ( DB_USERTABLE ) base.InnerList[index] ;}
}
![](/Images/OutliningIndicators/InBlock.gif)
protected override bool SetSelectCommand(System.Data.IDbCommand myCmd)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
myCmd.CommandText = myRecordInstance.GetSelectSQL() ;
return true;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**////<summary>
/// 初始化对象
///</summary>
public USERTABLECollection()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
myRecord = new DB_USERTABLE();
myRecordInstance = myRecord ;
}
}//public class USERTABLECollection : DBRecordCollectionBase