第十一章 访问数据库 - 首都师范大学

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. ODBC(Open Database Connectivity)是微软的开放服务体系结构WOSA中有关数据库的一个组成部分。一个基于ODBC的应用程序可以不依赖任何访问数据库。这种访问操作是依赖于不同DBMS的ODBC 和ODBC实现的。ODBC是一种结构,它由下列部件自上向下组成:

⑴;

⑵,用于管理被安装的ODBC驱动程序和;

⑶,用于管理驱动程序;

⑷ ODBC;

⑸ ODBC,提供ODBC和数据库之间的。

⑹,包含了和等信息,是一种数据连接抽象。

2. MFC为ODBC提供的用于建立与数据源连接的类CDatabase;在构造了一个该类对象之后,必须调用成员函数Open或OpenEx才能建立与数据库的连接。其中Open的原型如下:

virtual BOOL Open( LPCTSTR lpszDSN,

BOOL bExclusive = FALSE,

BOOL bReadOnly = FALSE,

LPCTSTR lpszConnect= “ODBC;”,

BOOL bUseCursorLib = TRUE );

throw( CDBException, CMemoryException );

例如在一个应用程序中定义了一个数据源连接类对象:

CDatabase m_db;

并需要与一个指定的用户身份UID=ZYF用户口令PWD=1234的数据源DSN = Student Registration以ODBC方式连接,该连接为共享、可读写并使用光标库,试写出两种用于实现该连接操作(可以忽略异常的俘获处理操作)的Open函数调用表达式:

答案:

3. MFC为ODBC提供的用于从数据源选择一组记录集的类CRecordset在构造了一个该类象对之后,然后调用Open成员函数按照指定的SELECT命令语句或表名查询数据源中的记录并建立记录集。CRecordset类构造函数的原型声明如下:

CRecordset( CDatabase* pDatabase = NULL);

根据pDatabase所传值的不同,构造记录集对象分为三种情况:

⑴ pDatabase指向一个CDatabase类对象,并且该对象已经通过调用CDatabase::Open

成员函数与一个指定的数据源成功连接,则记录集类构造函数的操作过程为:

在该数据源类对象上建立→调用CRecordset::Open。

⑵ pDatabase指向一个CDatabase类对象,但该对象没有与指定的数据源连接,则记录

集类构造函数的操作过程为:

在该数据源类对象上建立→调用与缺省指定的数据源连接→调用CRecordset::建立记录集。

⑶ pDatabase = NULL,则记录集类构造函数的操作过程为:

建立→调用的构造函数建立数据源连接对象→调用

连接缺省指定的数据源→调用建立记录集。

4. MFC为ODBC提供了用于与某个记录集直接相连的表单视图类,该类可以通过数据交换机制DDX在与表单视图控件之间的;而记录集字段数据与相应数据库的字段之间数据交换是通过CRecordset::实现的,该函数的参数是一个指针,指向记录字段数据交换机制的

对象。

5. 在记录集中,修改当前记录的操作必须按下列步骤进行:

⑴调用CRecordset::函数,进入模式。该函数将当前域数据成员的内容保

存到中。若调用Move(AFX_MOVE_REFRESH)可恢复数据,退出

模式。

⑵在模式下数据域成员的新值。

⑶调用CRecordset::函数,将改变后的记录写回并退出模式。

按照上述操作步骤,在CRecordView::OnMove函数中添加修改当前记录的功能,尝试在如下程序的空白处添入正确的代码:

virtual BOOL CRecordView::OnMove(UINT nIDMoveCommand)

{

CRecordset* pSet = OnGetRecordset();

if(pSet->CanUpdate())

{

pSet->; // 进入修改记录模式

if(!) //为数据域成员设置新值

return TRUE ;

pSet->; // 修改数据源

}

UpdateData(FALSE);

return TRUE;

}

6. 在记录集中,添加一个新记录的操作必须按下列步骤进行:

⑴调用CRecordset::函数,进入模式。该函数将当前域数据成员的内

容保存到并将所有域数据成员都设置NULL。若调用

Move(AFX_MOVE_REFRESH)可恢复数据,并退出模式。

⑵在模式下域数据成员的值。

⑶调用CRecordset::函数,将改变后的记录写回并退出模式。

例如,在CRecordView的派生类CSectionForm中定义了成员函数OnRecordAdd用于向记录集中添加新记录,其主要代码如下,试在程序的空白处添入正确的代码:

提示:由于CRecordView::OnMove成员函数在实现记录移动操作之前,需要通过调用成员函数CRecordset::Update使当前记录更新,所以调用OnMove隐含了对数据源的更新和退出记录的编辑或添加模式。

void CSectionForm::OnRecordAdd()

{

if(m_bAddMode) // m_bAddMode = TRUE指示记录集当前处于添加模式

(ID_RECORD_FIRST); // ID_RECORD_FIRST记录集首位置…

m_pSet->; // 进入添加新记录模式

m_pSet->SetFieldNull(&(m_pSet->m_CourseID), FALSE); // 设置数据域为空

m_bAddMode = ; // 设置添加模式状态标志

UpdateData(FALSE);

}

7. 在记录集中,删除当前记录的操作必须按下列步骤进行:

⑴调用CRecordset::函数,同时给和中的当前记录加上删除

标志。

⑵到另一个,跳过已删除的记录。

例如,在CRecordView的派生类CSectionForm中定义了成员函数OnRecordDelete用于从记录集中删除当前记录,其代码如下,试在程序的空白处添入正确的代码:

void CSectionForm::OnRecordDelete()

{

try

{

m_pSet->; // 为指定的记录集设置删除标志}

catch(CDBException, e)

{

AfxMessageBox(e->m_strError);

return;

}

m_pSet->; // 移动到下一记录,删除指定记录

if(m_pSet->IsEOF())

m_pSet->; // 移动到最后一个记录

if(m_pSet->IsBOF())

m_pSet->SetFieldNull(NULL); // 设置记录集为空

UpdateData(FALSE);

}

相关文档
最新文档