MFC DAO数据库编程

来源:互联网 发布:python查看版本 编辑:程序博客网 时间:2024/05/22 00:49

 

10.3 MFC DAO数据库编程

DAO(Database Access Object,数据访问对象)使用Microsoft Jet数据库引擎来访问数据库。MFC DAO封装了DAO的大部分功能,可以很方便地使用Microsoft Jet引擎访问数据库。本节就来介绍如何使用MFC DAO开发数据库应用程序。

10.3.1 MFC DAO概述

DAO适用于单系统应用程序或小范围本地分布使用。DAO提供一种通过程序代码创建和操作数据库的机制,多个DAO对象构成一个体系结构,在这个体系结构中,各个DAO对象协同工作。

MFC的DAO类和ODBC类有很多相似之处,主要有两点:

1) 都支持对各种ODBC数据源的访问。

2) 提供了功能相似的MFC类。例如DAO的CDaoDatabase类对应于ODBC的CDatabase类,DAO的CDaoRecordset类对应于ODBC的CRecordset类等。这些类所提供的程序函数大部分也相同。

尽管两者非常相似,但访问数据库的机制完全不同。ODBC的工作依赖于数据库制造商提供的驱动程序,而DAO直接利用Microsoft Jet引擎提供的数据库访问对象集进行工作

10.3.2 实例:使用MFC DAO访问数据库

本节设计的实例实现使用MFC DAO访问数据库的基本操作,实例的界面与10.2.2小节的实例完全一样,如图10-10所示。

  

实例同样实现了对数据库的基本操作:添加、修改、删除和遍历。与ODBC实例中不同的是,ODBC使用过程中添加了一个从CRecordset派生而来的CBook类,负责成员数据与数据表字段的关联,而本实例则是直接使用CDaoRecordset类。无论是使用ODBC还是DAO访问数据库都可以使用这两种方法,本实例采用后者来实现。

下面就来介绍这个实例的实现细节。

1) 定义数据库对象,并连接到指定数据库。

// 定义成员变量
CDaoDatabase db ;
// 在主对话框初始化过程中连接数据库
this->db.Open ( L"book.mdb", FALSE, FALSE, NULL ) ;

2) 添加记录功能实现如下。
 void CDAOSampleDlg::OnBnClickedAdd()
{
// 检测数据库是否已连接
if(this->db.IsOpen () == FALSE )
{
this->MessageBox ( L"未连接数据库!" ) ;
return ;
}
// 定义记录集对象,打开记录集
CDaoRecordset Record ( &this->db ) ;
Record.Open ( dbOpenDynaset, L"SELECT * FROM BOOK" ) ;
// 定义对话框对象,并设置为"添加"模式
CMyDlg AddBookDlg ;
AddBookDlg.SetMode ( TRUE ) ;
if(AddBookDlg.DoModal() == IDOK )
{
// 使用CDaoRecordset::AddNew函数表明要开始添加新记录
Record.AddNew () ;
// 设置新记录
Record.SetFieldValue ( 1, AddBookDlg.GetBookName().GetBuffer() ) ;
Record.SetFieldValue ( 2, AddBookDlg.GetAuthor().GetBuffer() ) ;
Record.SetFieldValue ( 3, AddBookDlg.GetPublish ().GetBuffer() ) ;
CString szTempStr ;
szTempStr.Format ( L"%d", AddBookDlg.GetPrice() ) ;
Record.SetFieldValue ( 4, szTempStr.GetBuffer() ) ;
// 只有在执行CDaoRecordset::Update函数后才会写入到数据库
Record.Update () ;
// 关闭记录集
Record.Close () ;
// 刷新界面列表控件数据显示
this->OnBnClickedFlush () ;
}
}
3) 修改记录功能实现如下。
 void CDAOSampleDlg::OnBnClickedModify()
{
// 检测数据库是否已连接
if(this->db.IsOpen () == FALSE )
{
this->MessageBox ( L"未连接数据库!" ) ;
return ;
}
// 检测是否选择书目
int nCurSel = this->BookList.GetNextItem ( -1,LVNI_SELECTED) ;
if(nCurSel == -1 )
{
this->MessageBox ( L"没有选择书目!" ) ;
return ;
}
// 定义记录集对象,并移动指针到指定位置
CDaoRecordset Record ( &this->db ) ;
Record.Open ( dbOpenDynaset, L"SELECT * FROM BOOK" ) ;
Record.Move ( nCurSel ) ;
// 定义对话框对象,并设置为"修改"模式
CMyDlg ModBookDlg ;
ModBookDlg.SetMode ( FALSE ) ;
// 把当前记录信息设置到对话框
COleVariant OleVariant ;
Record.GetFieldValue ( 1, OleVariant ) ;
ModBookDlg.SetBookName ( OleVariant.bstrVal ) ;
Record.GetFieldValue ( 2, OleVariant ) ;
ModBookDlg.SetAuthor ( OleVariant.bstrVal ) ;
Record.GetFieldValue ( 3, OleVariant ) ;
ModBookDlg.SetPublish ( OleVariant.bstrVal ) ;
Record.GetFieldValue ( 4, OleVariant ) ;
ModBookDlg.SetPrice ( OleVariant.uintVal ) ;
if(ModBookDlg.DoModal () == IDOK )
{
// 使用CDaoRecordset::Edit函数表明要开始修改当前记录
Record.Edit () ;
// 修改当前记录成员
Record.SetFieldValue ( 1, ModBookDlg.GetBookName().GetBuffer() ) ;
Record.SetFieldValue ( 2, ModBookDlg.GetAuthor().GetBuffer() ) ;
Record.SetFieldValue ( 3, ModBookDlg.GetPublish ().GetBuffer() ) ;
CString szTempStr ;
szTempStr.Format ( L"%d", ModBookDlg.GetPrice() ) ;
Record.SetFieldValue ( 4, szTempStr.GetBuffer() ) ;
// 只有在执行CDaoRecordset::Update函数后才会修改数据库记录
Record.Update () ;
// 关于记录集
Record.Close () ;
// 刷新界面列表控件数据显示
this->OnBnClickedFlush () ;
}
}
4) 删除记录功能实现如下。
void CDAOSampleDlg::OnBnClickedDel()
{
// 检测数据库是否已连接
if(this->db.IsOpen () == FALSE )
{
this->MessageBox ( L"未连接数据库!" ) ;
return ;
}
// 检测是否已选择书目
int nCurSel = this->BookList.GetNextItem ( -1,LVNI_SELECTED) ;
if(nCurSel == -1 )
{
this->MessageBox ( L"没有选择书目!" ) ;
return ;
}
// 定义记录集对象,并移动指针到指定位置
CDaoRecordset Record ( &this->db ) ;
Record.Open ( dbOpenDynaset, L"SELECT * FROM BOOK" ) ;
Record.Move ( nCurSel ) ;
// 删除当前记录
Record.Delete () ;
// 关闭记录集
Record.Close () ;
// 刷新界面列表控件数据显示
this->OnBnClickedFlush () ;
}
5) 遍历记录功能实现如下。
void CDAOSampleDlg::OnBnClickedFlush()
{
// 检测数据库是否已连接
if(this->db.IsOpen () == FALSE )
{
this->MessageBox ( L"未连接数据库!" ) ;
return ;
}
UINT nIndex = 0 ;
CString TempStr ;
COleVariant OleVariant ;
// 删除列表控件所有记录
this->BookList.DeleteAllItems () ;
// 定义记录集对象,并打开记录集
CDaoRecordset Record ( &this->db ) ;
Record.Open ( dbOpenDynaset, L"SELECT * FROM BOOK" ) ;
// 移动到第一条记录
Record.MoveFirst () ;
while( !Record.IsEOF() )
{
// 在列表控件添加记录
TempStr.Format ( L"%d", nIndex+1 ) ;
this->BookList.InsertItem ( nIndex, TempStr ) ;
for(int i = 1; i <= 3; i++ )
{
Record.GetFieldValue ( i, OleVariant ) ;
this->BookList.SetItemText ( nIndex, i, OleVariant.bstrVal ) ;
}
Record.GetFieldValue ( 4, OleVariant ) ;
TempStr.Format ( L"%d", OleVariant.uintVal ) ;
this->BookList.SetItemText ( nIndex, 4, TempStr ) ;
// 移到下一条记录
Record.MoveNext () ;
nIndex++ ;
}
// 关闭记录集
Record.Close () ;
}
6) 关闭数据库连接实现如下。
 this->db.Close ();

原创粉丝点击