DAO在MFC中的应用实例 .

简介: 本文介绍使用MFC DAO访问数据库的一个实例,其中实例来源于网络。    实例同样实现了对数据库的基本操作:添加、修改、删除和遍历。与ODBC实例中不同的是,ODBC使用过程中添加了一个从CRecordset派生而来的CBook类,负责成员数据与数据表字段的关联,而本实例则是直接使用CDaoRecordset类。

本文介绍使用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 ();

 

 

 

 

 

 

目录
相关文章
|
5月前
|
开发框架 前端开发 JavaScript
在各种开发项目中使用公用类库的扩展方法,通过上下文方式快速调用处理函数
在各种开发项目中使用公用类库的扩展方法,通过上下文方式快速调用处理函数
|
7月前
|
Java
java面向对象高级分层实例_测试类(main方法所在的类)
java面向对象高级分层实例_测试类(main方法所在的类)
|
存储 SQL Java
《JavaSE-第七章》之抽象的类-实例的对象-合理的封装
《JavaSE-第七章》之抽象的类-实例的对象-合理的封装
103 0
|
JSON API 数据格式
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
使用Autofac进行服务注册实践:新建三个项目,分别是webapi项目 Wesky.Core.Autofac以及两个类库项目 Wesky.Core.Interface和Wesky.Core.Service。在Webapi项目下,引用Autofac的三个包:Autofac、Autofac.Configuration和Autofac.Extensions.DependencyInjection 。
1371 1
.net core工具组件系列之Autofac—— 第一篇:Autofac系列Autofac的几种常见注册方式、生命周期和AOP
【vb.net机房收费系统】之没有包含要从继承的组件的已生成程序集
【vb.net机房收费系统】之没有包含要从继承的组件的已生成程序集
43 0
|
Java 程序员
Java面向对象8——接口(内含IDEA中有关创建接口的创建说明)
上一次我们说了抽象方法的存在是因为父类可以抽取子类中的共性方法,但是共性方法内实现方法不同所以要将共性方法写成抽象方法,那么如果子类中有一个“另类”不需要这个方法的话,我们就无法使用抽象方法了,而是要使用接口,哪个子类需要用,就继承该接口
385 0
Java面向对象8——接口(内含IDEA中有关创建接口的创建说明)
TP5.1门面类facade钩子behavior工具类,逻辑层service
TP5.1门面类facade钩子behavior工具类,逻辑层service
341 0
TP5.1门面类facade钩子behavior工具类,逻辑层service
|
设计模式
Java---设计模块(设计模块的简介及最简单的俩个单例代码加测试)
Java---设计模块(设计模块的简介及最简单的俩个单例代码加测试)
110 0