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