数据库操作(1.0.0.1)(续)


** 配置文件 datamodel.xml **

< DataModel >

< Command id ="1" name ="Get Bank Info" type ="command">

< CommandString >

SELECT * FROM Bank_Library WHERE bank_id = @bankId < Param id ="1" name ="@bankId" default ="bank_id" type ="int" size ="4" /> < Command id ="2" name ="Get Bank List" type ="command">

< CommandString >

SELECT * FROM Bank_Library WHERE bank_id = 1 < Command id ="3" name ="Get Account List" type ="command">

< CommandString >

SELECT * FROM Account

** 说明 ** :

1. DataModel :根接点。

2. Command :命令接点,代表一条 SQL 命令语句; id 命令编号,用来对命令进行编号,程序中将不使用; name 命令的名称,程序中通过这个名称来调用; type 命令的类型,有两种取值( command,produce ),代表是 SQL 语句还是存储过程。

3. CommandString :命令的 SQL 语句或存储过程的名称,直接填入可以在查询分析器中运行的 SQL 语句就可以。

4. Param :参数结点,每个结点代表一个参数, id 参数编号; name 参数名称,必须和上面结点中引用的一致; default 参数的缺省值; type 参数的数据类型; size 参数的数据长度;这些属性的设置都应该和数据库中的字段一致。

** 配置文件 tableDefine.xml **

< TableDefine >

< Table alias ="Privilege" name ="Privilege">

< Column alias ="privilegeNo" name ="privilege_No" datatype ="int" length ="4" nullflag ="false" primarykey ="true" foreignkey ="false" default ="" autoadd ="true"> < Column alias ="companyType" name ="company_Type" datatype ="varchar" length ="4" nullflag ="false" primarykey ="true" foreignkey ="false" default ="1" autoadd ="false"> < Column alias ="privilegeName" name ="privilege_Name" datatype ="varchar" length ="16" nullflag ="false" primarykey ="false" foreignkey ="false" default ="" autoadd ="false"> < Column alias ="privilegeDescription" name ="privilege_Description" datatype ="varchar" length ="100" nullflag ="true" primarykey ="false" foreignkey ="false" default ="" autoadd ="false">

** 说明: **

1. TableDefine :根结点。

2. Table :表结点,代表一个数据库表。 alias 表的别名,程序中引用; name 表的真实名称,和数据库中的表名一致。

3. Column :列结点,代表一列的定义。 alias 列的别名,程序中引用; name 列的真实名称,和数据库中的列名一致; datatype 列定义的数据类型; length 列定义的长度; nullflag 列是否允许为空的标志; primarykey 主键标志; foreignkey 外键标志; default 缺省值; autoadd 自增标志。

4. 数据库中表的定义将通过程序直接导入这个配置文件中,至于表和表的关系,以后我会加上的。

** IDBase 接口 **

此接口类定义了数据库操作所公共的接口,所有针对不同的数据库实现的数据库操作类都应该遵从于这个接口,并且工厂 ( Factory ) 模式的应用,使得上层调用的时候,可以不需要考虑下面使用的特定的数据库引擎。

目前: SQL 查询 语句是事先写定了放于配置文件 datamodel.xml 中的,参数数组中参数的顺序和配置文件中参数的顺序保持一致。

我将进一步修改,把简单的查询语句自动生成,而不需要事先写入 XML 文件。

string GetSingle( string sqlStr, string [] vals);

Hashtable GetSingleRow( string sqlStr, string [] vals);

ArrayList GetMultiRow( string sqlStr, string [] vals);

void CreateItem( string itemName, string [] colsValueArray);

void ModifyItem( string itemName, string itemId, string [] colsNameArray, string [] colsValueArray);

void DeleteItem( string itemName, string itemId);


* GetSingle() :根据传进去的数据库操作的名称(定义于配置文件中)、参数数组,取回一个字符串类型的单值,比如:根据用户姓名取用户的地址。

* GetSingleRow() :根据传进去的数据库操作的名称(定义于配置文件中)、参数数组,取回数据库表中的一行多列,结果按照字段名、值的对应关系,存放于 Hashtable 中,方便于使用。比如:根据用户姓名取出用户的信息,当有多个行返回的时候,取到数据集的第一行。

* GetMultiRow() :根据传进去的数据库操作的名称(定义于配置文件中)、参数数组,取回数据库表中的多行多列,取回的是一个数组,数组中的每个元素都是一个 Hashtable ,每个 Hashtable 存储数据库表中的一行多列。比如:取出 1979 年出生的所有的用户列表,每个用户存在于一个 Hashtable 中,取到的数组中包含了所有符合条件的所有用户列表。

* CreateItem() :根据传进去的表名、要插入表的值数组,生成 INSERT 语句,执行数据库插入操作。注意:表明是一个别名,定义于配置文件中,并不是真实的数据库表名,中间有个隐射关系,这样可以保证在数据库表名改变的情况下不需要改变程序。列名也是同样的处理;另外,要插入的值必须和配置文件 tableDefine.xml 中定义的字段顺序一致,否则生成的语句会出错。比如:向用户表中插入一个新用户。

* ModifyItem() :根据传进去的表名、主键的值、要修改表的字段数组、值数组,其中字段数组和值数组必须一一对应,然后自动生成 UPDATE 语句。比如:根据用户名,修改用户表中用户的地址、电话。

* DeleteItem() :根据传进去的表名、主键的值,自动生成 DELETE 语句。比如:根据用户名删除用户资料。

** SqlDBase 类 **

实现了 IDBase 接口,公共方法的实现和上面介绍的接口类一致,值得说明的是这个类提供了两个构造器。

public SqlDBase( string conName)

public SqlDBase()


使用默认的数据库,可以使用第二个构造器,如果使用其他的数据库连接,则使用第一个构造器,参数和配置文件 SystemConfig.xml 中数据库连接的名称对应,从而指不同的连接。

** DbaseFactory 类 **

这是一个工厂类,实现了工厂模式,目的是为了上层调用的时候,不需要关心使用的那个数据库操作类,这取决于配置文件中的设定。

public static IDBase GetDBaseUtility()

public static IDBase GetDBaseUtility( string conName)

{

IDBase myDBaseUtil = null ;

if (Constant.Data_Base.Equals("SQLSERVER2000"))

{

myDBaseUtil = new SqlDBase(conName);

}

return myDBaseUtil;

}


两个方法基本一致,参数只是为了指明使用哪个数据库连接。

** 工厂 Factory ** ** 模式 **

根据配置文件中指明的数据库,返回相应的操作类,在这里,如果配置中指定的数据库为“ SQLSERVER2000 ”,则返回 SqlDBase 类。

** 结束语 **

与数据库相关的类的介绍就到这里了,写的过程中,自己都觉得很多地方没有写清楚,有兴趣的朋友看了源码应该可以完全明白的,只是源码到目前还没有完全完成,等完成以后一定发给大家,希望大家看了以后能给小弟一点指定,谢谢各位的关注。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus