荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: baty (新一代懒人), 信区: Database
标  题: 在VC中建立自定义的数据库
发信站: BBS 荔园晨风站 (Mon Mar 12 22:02:10 2001), 转信

【 以下文字转载自 baty 的信箱 】
【 原文由 baty.bbs@argo.zsu.edu.cn 所发表 】
发信人: fellow (编程浪子), 信区: Database
标  题: 在VC中建立自定义的数据库
发信站: 逸仙时空 Yat-sen Channel (Wed Nov  1 10:57:31 2000), 站内信件

在VC++中建立自定义数据库类
哈尔滨工程大学计算中心 李健萍 李春艳 张积东
众所周知,VC++的MFC类库为编程者编制好了对数据库操作的类,编程者可以使用向导建立
一个与数据库联结并对数据库进行操作的应用程序,不需要编制任何代码,这无疑为编程
人员提供了一个捷径。但是,使用向导时只有选用基于单文档或多文档的项目才能选择数
据源与指定的的数据库相连,对用向导生成的基于对话框的应用程序不提供数据库的支持
。即使是基于单文档或多文档的应用程序,当需要一些特殊的操作,例如,打开一个表,要
求返回满足一定条件的记录集时,MFC并没有提供完全符合要求的现成函数。如果能利用
MFC所提供的数据库操作,再加上自己设计的函数,也就是说,设计一个对数据库操作的类
,在程序中手工加入这个类,那么就可以在基于对话框的应用程序中实现对数据库的操作
,而且,也可以针对自己应用程序的具体需要来设计类的函数,为特定功能的实现提供了很
大的方便。
在一个涉及数据库操作的应用程序中,常用到的MFC类有CdaoDatabase类、CdaoTableDef
类、CdaoRecordset类和 CdaoQueryDef类。当对数据库进行操作时,需要先打开数据库,
然后打开数据库中的表,再得到查询集和记录集。在自己定义的类中综合这四个类的操作
,设计一个打开表得到查询集和记录集的函数。以后,在应用程序中使用该类时只需包含
该类的头文件,所设计的函数就可以直接调用了。
建立数据库类的过程可分为如下四步。
1 定义一个无基类的 CdataBaseOperate类
1. 在Workspace窗口选择ClassView选项卡,在树型类结构图的根部单击鼠标右键,选择N
ew Class...,系统将弹出建立新类的对话框;
2. 在Class type中选择Generic Class;
3. 在Name中填写要建的新类的名称,要以大写字母C开头,系统会自动建立新类的头文件
和实现文件,文件的名称为类名去掉第一个大写字母C,如果想改变文件的名称,可以单击
change按钮;
4. 在填写好各项后,按OK按钮确定,一个无基类的新类建立成功。但他还是一个空类,下
一步就要给类添加内容。
2 在自定义的类中加入有关的定义
1. 在本应用程序中,使用ODBC与SQL SERVER的数据库相连,因而,在类的实现文件构造函
数前加入如下的定义:
#define SQL_DATABASE _T("ODBC;DSN=sql-database;UID=sa;PWD=pass;")
DSN=sql-database表示建立的ODBC联接的名称是sql-database,如果选用其他数据库,只
需在此改变与所需数据库建立的联接,或是重新配置sql-database,使之联接新的数据库
。UID=sa;PWD=pass表示登录数据库的用户名是sa,密码是pass,如果密码是空则表示为P
WD=""。
2. 在该类中综合使用到了MFC类库提供的有关数据库的几个类:CdaoDatabase类、CdaoT
ableDef类、CdaoRecordset类和CdaoQueryDef类,而这四个类的定义和实现都包括在头文
件afxdao.h中,因此,在新定义的类的头文件中一定要加上语句:
#include <afxdao.h>;
3. 对要用到的四个类各声明一个对象如下:
CDaoDatabase* loc_pDataBase;
CDaoTableDef* loc_pTable;
CDaoRecordset loc_pRecordset;
CDaoQueryDef* loc_pQueryDef;
其中CdaoDatabase类、CdaoTableDef类和CdaoQueryDef类定义了对象指针,在使用时要先
new,最后要delete。以CdaoDatabase类为例,在CdataBaseOperate类的构造函数中初始化
对象指针 loc_pDataBase=new CDaoDatabase;在析构函数中要释放该指针deleteloc_pD
ataBase。
3 在自定义的类中加入所需的函数和变量
手工加入函数包括两项工作,首先在头文件中加入函数的声明,然后在实现文件中加入函
数的具体实现,声明与实现一定要统一。
使用向导加入函数和变量:
1. 在Workspace窗口选择ClassView选项卡;
2. 在树型类结构图的要添加函数和变量的类上单击鼠标右键,如果加入成员函数则单击
Add Member Function,加入虚函数单击Add Virtual Function,加入成员变量单击 Add
Member Variable;
3. 出现对话框后,填写成员函数或变量的名称、类型,系统会自动添加函数的声明与实现
;
4. 添加函数的具体操作,可以通过编辑代码进一步填写。
这些操作将会在Workspace窗口的ClassView选项中立即体现出来,并且单击ClassView中
的相应函数就可进入该函数的实现部分,进一步编写代码。如果做不到这一点,说明添加
成员函数的操作有误。
下面以本应用程序为例,给出具体的表结构和几个主要函数的实现,读者可以根据自己的
实际情况设计函数。
本应用程序中的一个典型表的结构是:
序号 正题内容 难度系数 分值  答案  备注
整型 字符型  长整型  双精度 字符型 字符型
打开数据库的函数实现如下:
if (!loc_pDataBase->IsOpen())
loc_pDataBase->Open( NULL, FALSE, FALSE, SQL_DATABASE);
该函数中用到了CdaoDatabase类的两个函数IsOpen()和Open(NULL, FALSE, FALSE,SQL_
DATABASE),因为已经声明了该类的指针对象loc_pDataBase,所以可以直接调用CdaoData
base类的函数。其中Open()函数中的最后一个参数SQL_DATABASE在前面已经介绍过,通过
他打开相关的数据库。
由于程序中打开表后,不仅要返回所有的记录集,还用到返回满足一定条件的记录集,因此
打开表的函数除了带入表名外还有一个参数难度系数,lNDXS=0时,选择表中全部数据, l
NDXS=1~n时,表示选择难度系数=1~n的记录。
bool CDataBaseOperate::OpenTable(CString
strTableName,long lNDXS)
{
CString strFieldNumber;
loc_pTable=new CDaoTableDef(loc_pDataBase);
if (!loc_pTable->IsOpen())
loc_pTable->Open(strTableName); //打开指定的表名
strFieldNumber.Format("%d",loc_pTable->GetFieldCount()); //得到字段数
CString Sqlstr,Sqlstr1,Sqlstr2;
loc_pQueryDef=new CDaoQueryDef(loc_pDataBase);//得到查询集和记录集
if (lNDXS==0){ Sqlstr=_T("SELECT * FROM "+strTableName);}
else{ Sqlstr1="SELECT *FROM "+strTableName
Sqlstr2.Format(" WHERE 难度系数= %d",lNDXS);
Sqlstr=_T(Sqlstr1+Sqlstr2); }
loc_pQueryDef->Create(NULL,Sqlstr);
loc_pRecordset.Open(loc_pQueryDef);
m_nRecordNumber=0;
while(!loc_pRecordset.IsEOF()) {
m_nRecordNumber++;
loc_pRecordset.MoveNext();}
return TRUE;
}
为了维护数据库的安全,表用过后应该关闭,关闭表的同时,要释放在打开表的操作时初始
化的对象指针,例如:delete loc_pQueryDef。同样要注意,在构造函数中初始化的对象指
针,在析构函数中一定要释放。对象指针的初始化和释放是成对出现的。
loc_pDataBase=new CDaoDatabase; //在构造函数中初始化对象指针。
delete loc_pDataBase; //在析构函数中释放该对象指针。
4 CdataBaseOperate类的应用
1. 使用VC++的向导生成一个应用程序,可以根据需要选择基于对话框或是基于单、多文
档,选择单文档或多文档时不要选择数据库支持。
2. 在应用程序的主头文件中加入#include "DataBaseOperate.h",并且还要声明一个
CdataBaseOperate类的对象,public:
CDataBaseOperate m_CDataBaseOperate。
3. 有了指向CdataBaseOperate类的对象后,刚刚在CdataBaseOperate类中编制的函数都
可以通过"m_CdataBaseOperate.函数名"来调用。

--
欢迎到Database坐坐







※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 192.168.2.27]
--
※ 转寄:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 210.39.3.50]
--
※ 转载:·BBS 荔园晨风站 bbs.szu.edu.cn·[FROM: 192.168.1.118]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店