DAO在MFC中的应用实例

本文介绍使用MFC DAO访问数据库的方法,实现添加、修改、删除及遍历记录的功能。通过具体实例展示了如何连接数据库、操作记录集以及更新界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍使用MFC DAO访问数据库的一个实例,其中实例来源于网络。


实例同样实现了对数据库的基本操作:添加、修改、删除和遍历。与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().GetBuffe() ) ;

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 ();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值