预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共36页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第13章数据库应用程序的开发13.1有关数据库的基础知识13.2ODBC介绍和引用13.2.1ODBC简介ODBC数据源控制台就是Windows系统管理数据源的控制台,所有的数据库驱动,以及数据源登记都要在此发布,并向系统发出请求。 通过使用ODBCAPI和MFCODBC类,可以访问任何数据资源。只要应用程序的用户的终端机器上有ODBC的驱动,都可以访问任何地方的数据源。 ODBC是一种接口,它是通过相应的各个数据库的ODBC驱动来访问各种数据库中的数据。使用ODBC,能够使应用程序独立于数据库的硬件环境,ODBC提供的API函数独立于数据库管理系统。ODBC是Microsoft的Windows系统下的数据库服务的一部分。它是由下面几个部分构成的: ODBCAPI:包含在一个动态库中的函数集合、一个错误代码的集合、一个标准的SQL语句集合,用来调用DBMS中的数据。 ODBCDriverManager:一个动态库文件(ODBC32.DLL)来加载ODBC驱动,这个DLL对你的应用程序是透明的。 ODBCdatabasedrivers:由一个或是多个DLL构成,其中含有ODBCAPI,这些DLL由其拥有者DBMS调用。 ODBCCursorLibrary:这也是一个动态连接库文件。 ODBCAdministrator:这是一个ODBC控制台,用来管理不同的数据源。13.2.2MFC对ODBC的封装13.2.3如何访问数据库13.2.4在数据库应用程序中常用的几个类【例13-1】创建一个数据库应用程序,可以显示Access数据库表中的记录。步骤:选择已创建好的数据库My_Access_db.mdb表单用ClassWizard给相应的EditBox连接变量,注意,在AddMemberVariable对话框中的下拉组合框中已经有了相应表中的字段,只要选中相应的字段就可以了2CRecordset类3CDatabase类4RFX下面代码就是【例13-1】工程文件中AppWizard自动加入的RFX代码,见粗斜体部分: voidCODBCSet::DoFieldExchange(CFieldExchange*pFX) { //{{AFX_FIELD_MAP(CODBCSet) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_Long(pFX,_T("[书籍ID]"),m___ID); RFX_Text(pFX,_T("[作者]"),m_column1); RFX_Text(pFX,_T("[出版社]"),m_column2); RFX_Text(pFX,_T("[价格]"),m_column3); //}}AFX_FIELD_MAP }函数DoFieldExchange是RFX机制的中枢,任何时候应用框架需要从数据源到数据库或是从数据库到数据源,都要调用DoFieldExchange函数。 下面是CRecordset派生类的头文件,其中关于RFX机制的部分已经用粗斜体显示: classCODBCSet:publicCRecordset {… //Field/ParamData //{{AFX_FIELD(CODBCSet,CRecordset) long m___ID; CString m_column1; CString m_column2; CString m_column3; //}}AFX_FIELD //Overrides //ClassWizardgeneratedvirtualfunctionoverrides //{{AFX_VIRTUAL(CODBCSet) public: …… virtualvoidDoFieldExchange(CFieldExchange*pFX);//RFXsupport //}}AFX_VIRTUAL …};5CDBException【例13-2】在【例13-1】的基础上增加“删除一个记录”、“更新记录”和“清除域”三个菜单项,并实现相应的操作。2重载OnMove函数BOOLCODBCView::OnMove(UINTnIDMoveCommand) {switch(nIDMoveCommand) {caseID_RECORD_PREV: m_pSet->MovePrev(); if(!m_pSet->IsBOF()) break;//如果移到数据库的开始,自动执行MoveFirst函数 caseID_RECORD_FIRST: m_pSet->MoveFirst(); break; caseID_RECORD_NEXT: m_pSet->MoveNext(); if(!m_pSet->IsEOF()) break;