zoukankan      html  css  js  c++  java
  • DAO在MFC中的应用实例 .

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

  • 相关阅读:
    Logstash:input plugin 介绍
    Beats:使用Elastic Stack对Redis监控
    Elastic:Elasticsearch的分片管理策略
    Beats:使用Elastic Stack对Nginx Web服务器监控
    Beats:使用Elastic Stack监控RabbitMQ
    Elasticsearch启动https访问
    Elasticsearch:跨集群复制 Cross-cluster replication(CCR)
    Logstash: 如何创建可维护和可重用的Logstash管道
    Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (二)
    Solutions:Elastic workplace 搜索:随时随地搜索所有内容 (一)
  • 原文地址:https://www.cnblogs.com/lidabo/p/2568659.html
Copyright © 2011-2022 走看看