CSDN博客

img myth1979

数据库操作(1.0.0.1)(续)

发表于2003/12/22 18:18:00  601人阅读

 

配置文件datamodel.xml

 

<?xml version="1.0" encoding="gb2312" ?>

<DataModel>

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

         <CommandString>

              SELECT * FROM Bank_Library WHERE bank_id = @bankId

         </CommandString>

         <Param id="1" name="@bankId" default="bank_id" type="int" size="4" />

     </Command>

     <Command id="2" name="Get Bank List" type="command">

         <CommandString>

              SELECT * FROM Bank_Library WHERE bank_id = 1

         </CommandString>

     </Command>

     <Command id="3" name="Get Account List" type="command">

         <CommandString>

              SELECT * FROM Account

         </CommandString>

     </Command>

</DataModel>

 

说明

1.       DataModel:根接点。

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

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

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

 

配置文件tableDefine.xml

 

<?xml version="1.0" encoding="utf-8" ?>

<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>

         <Column alias="companyType" name="company_Type" datatype="varchar" length="4" nullflag="false" primarykey="true" foreignkey="false" default="1" autoadd="false"></Column>

         <Column alias="privilegeName" name="privilege_Name" datatype="varchar" length="16" nullflag="false" primarykey="false" foreignkey="false" default="" autoadd="false"></Column>

         <Column alias="privilegeDescription" name="privilege_Description" datatype="varchar" length="100" nullflag="true" primarykey="false" foreignkey="false" default="" autoadd="false"></Column>

     </Table>

</TableDefine>

 

说明:

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类。

 

 

结束语

 

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

 

0 0

相关博文

我的热门文章

img
取 消
img