分享
 
 
 

数据库操作(1.0.0.1)(续)

王朝other·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

配置文件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类。

结束语

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有