一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

MFC關(guān)于ODBC數(shù)據(jù)庫連接

 行走在理想邊緣 2014-05-05
一、數(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工程文件
    

       

       

       
用ClassWizard給相應(yīng)的Edit Box連接變量,注意,在Add Member Variable 對話框中的下拉組合框中已經(jīng)有了相應(yīng)表中的字段,只要選中相應(yīng)的字段就可以了
    

      添加菜單響應(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); //不論任何情況,都更新表單
}
}
  

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产一区二区三区精品免费| 日韩欧美好看的剧情片免费 | 香蕉网尹人综合在线观看| 久久国产精品亚州精品毛片| 亚洲国产成人久久一区二区三区| 黄色片一区二区三区高清| 亚洲乱码av中文一区二区三区| 五月婷婷综合激情啪啪| 超薄丝袜足一区二区三区| 91亚洲精品亚洲国产| 亚洲欧美中文日韩综合| 东京热加勒比一区二区三区| 欧美日韩少妇精品专区性色| 精产国品一二三区麻豆| 国产精品午夜小视频观看| 日韩国产亚洲一区二区三区| 国产精品视频久久一区| 亚洲专区中文字幕在线| 国产精品福利精品福利| 少妇视频一区二区三区| 成人精品网一区二区三区| 日本午夜免费观看视频| 色好吊视频这里只有精| 97人妻精品免费一区二区| 在线观看视频成人午夜| 国产色偷丝袜麻豆亚洲| 国自产拍偷拍福利精品图片| 国产又粗又爽又猛又黄的| 暴力性生活在线免费视频| 青青草草免费在线视频| 护士又紧又深又湿又爽的视频| 亚洲国产综合久久天堂| 大香蕉伊人精品在线观看| 小草少妇视频免费看视频| 国产亚洲精品久久99| 国产一级特黄在线观看| 污污黄黄的成年亚洲毛片| 欧美特色特黄一级大黄片| 欧美日韩精品综合一区| 成人你懂的在线免费视频| 国产精品日韩欧美一区二区|