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

合集下载
  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);
}
X。

相关文档
最新文档