一、數(shù)據(jù)庫應(yīng)用程序中常用的幾個類 1。CrecordView類 一個CRecordView對象就是用一個視圖中的控件來顯示數(shù)據(jù)庫中的記錄。CRecordView類使用了動態(tài)數(shù)據(jù)交換(DDX)和數(shù)據(jù)庫交換(RFX),在視圖上的控件和數(shù)據(jù)源中的數(shù)據(jù)庫中進(jìn)行數(shù)據(jù)交換。 AppWizard 生成CRecordView和CRecordset類,并和相應(yīng)的數(shù)據(jù)源關(guān)聯(lián)。 2。CRecordset類 為了能夠處理各種的數(shù)據(jù)庫,最好從類CRecordset派生出一個子類來。數(shù)據(jù)庫從數(shù)據(jù)源讀取數(shù)據(jù)后,可以做以下的工作: 翻閱所有的記錄。 修改記錄,設(shè)定鎖定狀態(tài)。挑選有用的記錄。給數(shù)據(jù)庫排序。給定參數(shù),讓數(shù)據(jù)庫在運(yùn)行的時候自動選擇數(shù)據(jù)。 3。CDatabase類 CDatabase在afxdb.h中定義。其對象是用來連接一個數(shù)據(jù)源的。為了使用CDatabase對象,需調(diào)用構(gòu)造函數(shù),并調(diào)用OpenEx或是Open函數(shù),這將會打開一個連接。當(dāng)構(gòu)造一個CDatabase類完成后,可以向CRecordset類的對象傳遞這個CDatabase類的指針。連接數(shù)據(jù)源結(jié)束時,必須用Close函數(shù)關(guān)閉這個對象。 4。RFX 5。CDBException CDBException是用來處理從其它ODBC類傳過來的異常情況的。這個類一般是和關(guān)鍵字CATCH連用的。同樣的用戶也可以用全局函數(shù)AfxThrowDBException拋出一個異常情況 二、實(shí)例步驟 1。用AppWizard來生成一個單文檔的ODBC工程文件 添加菜單響應(yīng)函數(shù) void CODBCView::OnDeleteRecord() //刪除記錄 {CRecordsetStatus m_cStatus; try{ m_pSet->Delete(); } catch(CDBException* m_pEx) { AfxMessageBox(m_pEx->m_strError); m_pEx->Delete(); m_pSet->MoveFirst(); //若失敗,將記錄指針移到首記錄 UpdateData(FALSE); return; } m_pSet->GetStatus(m_cStatus); if(m_cStatus.m_lCurrentRecord==0) m_pSet->MoveFirst(); //刪除了最后一個記錄 else m_pSet->MoveNext(); UpdateData(FALSE); } void CODBCView::OnUpdateDeleteRecord(CCmdUI* pCmdUI) //刪除后的刷新 { pCmdUI->Enable(!m_pSet->IsEOF()); } void CODBCView::OnUpdateRecord() { m_pSet->Edit(); UpdateData(TRUE); if(m_pSet->CanUpdate()) m_pSet->Update(); } void CODBCView::OnUpdateUpdateRecord(CCmdUI* pCmdUI) //刷新記錄集 { pCmdUI->Enable(!m_pSet->IsEOF()); } void CODBCView::OnClearDomain() //清除域 { m_pSet->SetFieldNull(NULL); UpdateData(FALSE); } long CODBCSet::GetMaxID() { MoveLast(); //移到最后一條記錄 return m___ID; //返回該ID值 } void CODBCView::OnAddRecord() {CRecordset * pSet=OnGetRecordset();//獲取指向數(shù)據(jù)庫的指針 if(pSet->CanUpdate()&&!pSet->IsDeleted()) //確認(rèn)對數(shù)據(jù)庫的任何修改均已保存 { pSet->Edit(); if(!UpdateData()) return; pSet->Update(); } long m_lNewID=m_pSet->GetMaxID()+1;//獲取新的ID值 m_pSet->AddNew(); //添加一個新記錄 m_pSet->m___ID=m_lNewID; //設(shè)置新的ID標(biāo)識 m_pSet->Update(); //保存新的記錄 m_pSet->Requery(); //刷新數(shù)據(jù)庫 m_pSet->MoveLast(); //游標(biāo)移到最后一條記錄 UpdateData(FALSE); //更新表單 } void CODBCView::OnMoveToRecord() {CMoveToRecord dlgMoveTo; //創(chuàng)建CMoveToRecord類的對象實(shí)例 if(dlgMoveTo.DoModal()==IDOK) { CRecordset *pSet=OnGetRecordset(); //指向數(shù)據(jù)庫記錄的指針 if(pSet->CanUpdate() && !pSet->IsDeleted()) { //所有的修改保存否? pSet->Edit(); if(!UpdateData()) return; pSet->Update(); } pSet->SetAbsolutePosition(dlgMoveTo.m_RecordID); //設(shè)置新的位置 UpdateData(FALSE); //更新表單 } } 由于CRecordset類的對象或從CRecordset類繼承的對象都擁有一個m_strSort成員,它決定了對記錄的排序,在“記錄”菜單中增加菜單項“按價格排序”,(ID_SORT_PRICE),并為它映射COMMAND消息處理函數(shù)OnSortPrice()。 void CODBCView::OnSortPrice() { m_pSet->Close(); //關(guān)閉數(shù)據(jù)庫 m_pSet->m_strSort=“價格”; //指定排序字段 m_pSet->Open(); //再次打開數(shù)據(jù)庫 UpdateData(FALSE); //更新已經(jīng)排序過的記錄 } 由于用了CRecordset類的成員m_strSort,因此對數(shù)據(jù)庫記錄的排序不用進(jìn)行太多的代碼干預(yù)。 最后在工具欄中增加Sort工具按鈕,實(shí)現(xiàn)菜單項“按價格排序”的功能。 假設(shè)按“作者”字段進(jìn)行查詢,為菜單項“按作者查找”所映射的COMMAND消息處理函數(shù)代碼如下: void CODBCView::OnSearch() { DoFilter("作者"); } void CODBCView::DoFilter(CString col) {CSearchDlg dlg; int result=dlg.DoModal(); if(result==IDOK) { CString str=col+"='"+dlg.m_Edit_Search+"'"; //接收查詢字符串 m_pSet->Close(); //關(guān)閉原來的表單 m_pSet->m_strFilter=str; //將查詢條件賦給過濾器 m_pSet->Open(); //打開經(jīng)過過濾的表單 int recCount=m_pSet->GetRecordCount(); //計算滿足條件的記錄數(shù) if(recCount==0) //如果沒有找到相關(guān)記錄 { MessageBox(“No matching records.”); m_pSet->Close(); //關(guān)閉表單 m_pSet->m_strFilter; //將過濾結(jié)果給過濾器 m_pSet->Open(); //據(jù)過濾結(jié)果打開表單(什么都沒找到) } UpdateData(FALSE); //不論任何情況,都更新表單 } } |
|