哈尔滨工程大学计算中心 李健萍 李春艳 张积东
众所周知,VC ++的MFC 类库为编程者编制好了对数据库操作的类,编程者可以使用向导建立一个与数据库联结并对数据库进行操作的应用程序,不需要编制任何代码, 这无疑为编程人员提供了一个捷径。但是,使用向导时只有选用基于单文档或多文档的项目才能选择数据源与指定的的数据库相连, 对用向导生成的基于对话框的应用程序不提供数据库的支持。即使是基于单文档或多文档的应用程序, 当需要一些特殊的操作,例如,打开一个表,要求返回满足一定条件的记录集时,MFC 并没有提供完全符合要求的现成函数。如果能利用MFC 所提供的数据库操作,再加上自己设计的函数,也就是说,设计一个对数据库操作的类,在程序中手工加入这个类, 那么就可以在基于对话框的应用程序中实现对数据库的操作,而且,也可以针对自己应用程序的具体需要来设计类的函数,为特定功能的实现提供了很大的方便。| 序号 | 正题内容 | 难度系数 | 分值 | 答案 | 备注 |
| 整型 | 字符型 | 长整型 | 双精度 | 字符型 | 字符型 |
打开数据库的函数实现如下:
if (!loc_pDataBase ->IsOpen())
loc_pDataBase ->Open
( NULL, FALSE, FALSE, SQL_DATABASE);
该函数中用到了CdaoDatabase 类的两个函数IsOpen() 和Open(NULL, FALSE,
FALSE, SQL_DATABASE),因为已经声明了该类的指针对象loc_pDataBase,所以可以直接调用CdaoDatabase
类的函数。其中Open()函数中的最后一个参数SQL_DATABASE
在前面已经介绍过,通过他打开相关的数据库。
由于程序中打开表后,不仅要返回所有的记录集,还用到返回满足一定条件的记录集,因此打开表的函数除了带入表名外还有一个参数难度系数,lNDXS=0
时, 选择表中全部数据, lNDXS=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;
// 在析构函数中释放该对象指针。
CdataBaseOperate 类的应用
1. 使用VC
++的向导生成一个应用程序,可以根据需要选择基于对话框或是基于单、多文档,选择单文档或多文档时不要选择数据库支持。
2. 在应用程序的主头文件中加入#include "DataBaseOperate.h",并且还要声明一个CdataBaseOperate
类的对象,public: CDataBaseOperate m_CDataBaseOperate。
3. 有了指向CdataBaseOperate 类的对象后,刚刚在CdataBaseOperate
类中编制的函数都可以通过“m_CdataBaseOperate
.函数名”来调用。