天天看點

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

      {

             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 )

             return ;

       }

       // 檢測是否已選擇書目

       int nCurSel = this->BookList.GetNextItem ( -1,LVNI_SELECTED) ;

       if(nCurSel == -1 )

       {

             this->MessageBox ( L"沒有選擇書目!" ) ;

        }

       // 定義記錄集對象,并移動指針到指定位置

       CDaoRecordset Record ( &this->db ) ;

       // 删除目前記錄Record.Delete () ;

       // 關閉記錄集Record.Close () ;

       // 重新整理界面清單控件資料顯示this->OnBnClickedFlush () ;

}   

5) 周遊記錄功能實作如下。

void CDAOSampleDlg::OnBnClickedFlush()

       if(this->db.IsOpen () == FALSE )

            this->MessageBox ( L"未連接配接資料庫!" ) ;

            return ;

       UINT nIndex = 0 ;

       CString TempStr ;

       // 删除清單控件所有記錄

       this->BookList.DeleteAllItems () ;

       // 定義記錄集對象,并打開記錄集

       // 移動到第一條記錄

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