第13章_數(shù)據(jù)庫應(yīng)用程序的開發(fā)_第1頁
第13章_數(shù)據(jù)庫應(yīng)用程序的開發(fā)_第2頁
第13章_數(shù)據(jù)庫應(yīng)用程序的開發(fā)_第3頁
第13章_數(shù)據(jù)庫應(yīng)用程序的開發(fā)_第4頁
第13章_數(shù)據(jù)庫應(yīng)用程序的開發(fā)_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

.,1,第13章數(shù)據(jù)庫應(yīng)用程序的開發(fā),.,2,13.1有關(guān)數(shù)據(jù)庫的基礎(chǔ)知識,現(xiàn)有的數(shù)據(jù)庫軟件有很多,如大型數(shù)據(jù)庫Oracle、SQLServer,小數(shù)據(jù)庫Access等,都支持關(guān)系模型,數(shù)據(jù)庫模型,層次模型網(wǎng)狀模型關(guān)系模型面向?qū)ο竽P?.,3,13.2ODBC介紹和引用,.,4,13.2.1ODBC簡介,MS推出了OpenDatabaseConnectivity,簡稱ODBC。它包含訪問不同數(shù)據(jù)庫所要求的ODBC驅(qū)動程序。只要調(diào)用ODBC所支持的函數(shù),動態(tài)鏈接到不同的驅(qū)動程序上即可。一個基于ODBC的應(yīng)用程序?qū)?shù)據(jù)庫的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數(shù)據(jù)庫操作由對應(yīng)的DBMS的ODBC驅(qū)動程序完成。也就是說,不論是Oracle、SQLServer還是Access數(shù)據(jù)庫,均可用ODBCAPI進(jìn)行訪問。由此可見,ODBC的最大優(yōu)點(diǎn)是能以統(tǒng)一的方式處理所有的數(shù)據(jù)庫。,.,5,ODBC數(shù)據(jù)源控制臺就是Windows系統(tǒng)管理數(shù)據(jù)源的控制臺,所有的數(shù)據(jù)庫驅(qū)動,以及數(shù)據(jù)源登記都要在此發(fā)布,并向系統(tǒng)發(fā)出請求。通過使用ODBCAPI和MFCODBC類,可以訪問任何數(shù)據(jù)資源。只要應(yīng)用程序的用戶的終端機(jī)器上有ODBC的驅(qū)動,都可以訪問任何地方的數(shù)據(jù)源。ODBC是一種接口,它是通過相應(yīng)的各個數(shù)據(jù)庫的ODBC驅(qū)動來訪問各種數(shù)據(jù)庫中的數(shù)據(jù)。使用ODBC,能夠使應(yīng)用程序獨(dú)立于數(shù)據(jù)庫的硬件環(huán)境,ODBC提供的API函數(shù)獨(dú)立于數(shù)據(jù)庫管理系統(tǒng)。,.,6,ODBC是Microsoft的Windows系統(tǒng)下的數(shù)據(jù)庫服務(wù)的一部分。它是由下面幾個部分構(gòu)成的:ODBCAPI:包含在一個動態(tài)庫中的函數(shù)集合、一個錯誤代碼的集合、一個標(biāo)準(zhǔn)的SQL語句集合,用來調(diào)用DBMS中的數(shù)據(jù)。ODBCDriverManager:一個動態(tài)庫文件(ODBC32.DLL)來加載ODBC驅(qū)動,這個DLL對你的應(yīng)用程序是透明的。ODBCdatabasedrivers:由一個或是多個DLL構(gòu)成,其中含有ODBCAPI,這些DLL由其擁有者DBMS調(diào)用。ODBCCursorLibrary:這也是一個動態(tài)連接庫文件。ODBCAdministrator:這是一個ODBC控制臺,用來管理不同的數(shù)據(jù)源。,.,7,13.2.2MFC對ODBC的封裝,.,8,13.2.3如何訪問數(shù)據(jù)庫,建立ODBC數(shù)據(jù)源連接數(shù)據(jù)源選擇和處理記錄數(shù)據(jù)庫應(yīng)用程序中的文檔和視圖,訪問數(shù)據(jù)庫,.,9,13.2.4在數(shù)據(jù)庫應(yīng)用程序中常用的幾個類,1CRecordView類,一個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)。,.,10,【例13-1】創(chuàng)建一個數(shù)據(jù)庫應(yīng)用程序,可以顯示Access數(shù)據(jù)庫表中的記錄。,.,11,步驟:,1.用AppWizard來生成一個單文檔的ODBC工程文件,.,12,選擇已創(chuàng)建好的數(shù)據(jù)庫My_Access_db.mdb表單,.,13,用ClassWizard給相應(yīng)的EditBox連接變量,注意,在AddMemberVariable對話框中的下拉組合框中已經(jīng)有了相應(yīng)表中的字段,只要選中相應(yīng)的字段就可以了,.,14,2CRecordset類,為了能夠處理各種的數(shù)據(jù)庫,最好從類CRecordset派生出一個子類來。數(shù)據(jù)庫從數(shù)據(jù)源讀取數(shù)據(jù)后,可以做以下的工作:翻閱所有的記錄。修改記錄,設(shè)定鎖定狀態(tài)。挑選有用的記錄。給數(shù)據(jù)庫排序。給定參數(shù),讓數(shù)據(jù)庫在運(yùn)行的時候自動選擇數(shù)據(jù)。,.,15,3CDatabase類,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)閉這個對象。,.,16,4RFX,RFX(RecordFieldExchange)是支持應(yīng)用程序的一個交換機(jī)制,當(dāng)從CRecordset類派生一個類,在交換數(shù)據(jù)的時候沒有選擇大容量交換的方式(BulkRFX)時,RFX機(jī)制將在數(shù)據(jù)交換中起作用。RFX在視圖和數(shù)據(jù)源之間自動交換數(shù)據(jù),由于一次交換的數(shù)據(jù)可能不止一個,為此可能要多次調(diào)用DoFieldExchange函數(shù),同時它也是應(yīng)用程序框架和ODBC交流的媒介。RFX機(jī)制能夠安全的通過調(diào)用(例如ODBC函數(shù)SQLBindCol)來保存用戶的工作。,.,17,下面代碼就是【例13-1】工程文件中AppWizard自動加入的RFX代碼,見粗斜體部分:voidCODBCSet:DoFieldExchange(CFieldExchange*pFX)/AFX_FIELD_MAP(CODBCSet)pFX-SetFieldType(CFieldExchange:outputColumn);RFX_Long(pFX,_T(書籍ID),m_ID);RFX_Text(pFX,_T(作者),m_column1);RFX_Text(pFX,_T(出版社),m_column2);RFX_Text(pFX,_T(價格),m_column3);/AFX_FIELD_MAP,.,18,函數(shù)DoFieldExchange是RFX機(jī)制的中樞,任何時候應(yīng)用框架需要從數(shù)據(jù)源到數(shù)據(jù)庫或是從數(shù)據(jù)庫到數(shù)據(jù)源,都要調(diào)用DoFieldExchange函數(shù)。下面是CRecordset派生類的頭文件,其中關(guān)于RFX機(jī)制的部分已經(jīng)用粗斜體顯示:classCODBCSet:publicCRecordset/Field/ParamData/AFX_FIELD(CODBCSet,CRecordset)longm_ID;CStringm_column1;CStringm_column2;CStringm_column3;/AFX_FIELD/Overrides/ClassWizardgeneratedvirtualfunctionoverrides/AFX_VIRTUAL(CODBCSet)public:virtualvoidDoFieldExchange(CFieldExchange*pFX);/RFXsupport/AFX_VIRTUAL;,.,19,5CDBException,CDBException是用來處理從其它ODBC類傳過來的異常情況的。這個類一般是和關(guān)鍵字CATCH連用的。同樣的用戶也可以用全局函數(shù)AfxThrowDBException拋出一個異常情況,m_nRetCode:它包含了一個結(jié)構(gòu)體RETCODE,里面包含了ODBC的錯誤信息的描述。m_strError:包含一個描敘異常情況的字符串。m_strStateNativeOrigin:包含描述異常情況的字符串m_strStateNativeOrigin;如果變量包含多個錯誤的描述,錯誤會分行顯示。,CDBException類的成員變量,.,20,【例13-2】在【例13-1】的基礎(chǔ)上增加“刪除一個記錄”、“更新記錄”和“清除域”三個菜單項,并實(shí)現(xiàn)相應(yīng)的操作。,響應(yīng)COMMAND命令,響應(yīng)命令UPDATE_COMMAND_UI,1加入菜單項,.,21,2重載OnMove函數(shù),.,22,BOOLCODBCView:OnMove(UINTnIDMoveCommand)switch(nIDMoveCommand)caseID_RECORD_PREV:m_pSet-MovePrev();if(!m_pSet-IsBOF()break;/如果移到數(shù)據(jù)庫的開始,自動執(zhí)行MoveFirst函數(shù)caseID_RECORD_FIRST:m_pSet-MoveFirst();break;caseID_RECORD_NEXT:m_pSet-MoveNext();if(!m_pSet-IsEOF()break;if(!m_pSet-CanScroll()m_pSet-SetFieldNull(NULL);/清空屏幕break;caseID_RECORD_LAST:m_pSet-MoveLast();break;default:ASSERT(FALSE);/異常情況UpdateData(FALSE);/交換數(shù)據(jù)returnTRUE;,.,23,3添加菜單響應(yīng)函數(shù),voidCODBCView:OnDeleteRecord()/刪除記錄CRecordsetStatusm_cStatus;trym_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();/刪除了最后一個記錄elsem_pSet-MoveNext();UpdateData(FALSE);,.,24,voidCODBCView:OnUpdateDeleteRecord(CCmdUI*pCmdUI)/刪除后的刷新pCmdUI-Enable(!m_pSet-IsEOF();voidCODBCView:OnUpdateRecord()m_pSet-Edit();UpdateData(TRUE);if(m_pSet-CanUpdate()m_pSet-Update();,.,25,voidCODBCView:OnUpdateUpdateRecord(CCmdUI*pCmdUI)/刷新記錄集pCmdUI-Enable(!m_pSet-IsEOF();voidCODBCView:OnClearDomain()/清除域m_pSet-SetFieldNull(NULL);UpdateData(FALSE);,.,26,【例13-3】在【例13-2】的基礎(chǔ)上增加功能,使得程序能夠向數(shù)據(jù)庫中添加新記錄。,增加一個菜單項“增加一個新記錄”,其ID標(biāo)識為ID_ADD_RECORD,.,27,在數(shù)據(jù)庫中增加記錄步驟:得到最后一條記錄的ID號將其加1通過AddNew函數(shù)來添加記錄把新的ID值設(shè)置為新增記錄中的ID字段值用Update函數(shù)保存新記錄調(diào)用Requery函數(shù)更新記錄把輸入控制滾動到數(shù)據(jù)庫中的最后一條記錄上,.,28,為了計算新的ID號,需增加CODBCSet類的成員函數(shù)GetMaxID,longCODBCSet:GetMaxID()MoveLast();/移到最后一條記錄returnm_ID;/返回該ID值,.,29,voidCODBCView:OnAddRecord()CRecordset*pSet=OnGetRecordset();/獲取指向數(shù)據(jù)庫的指針if(pSet-CanUpdate()/更新表單,.,30,【例13-4】在【例13-3】的基礎(chǔ)上增加瀏覽記錄的功能和對記錄進(jìn)行排序的功能。創(chuàng)建對話框,通過在對話框中指定記錄序號(記錄序號不是記錄的ID號標(biāo)識)來瀏覽該條記錄的內(nèi)容。,IDD_MOVE_RECORD,IDC_RECORD_ID,.,31,voidCODBCView:OnMoveToRecord()CMoveToRecorddlgMoveTo;/創(chuàng)建CMoveToRecord類的對象實(shí)例if(dlgMoveTo.DoModal()=IDOK)CRecordset*pSet=OnGetRecordset();/指向數(shù)據(jù)庫記錄的指針if(pSet-CanUpdate()/更新表單,.,32,由于在視圖中響應(yīng)了對話框的操作,因此,還需要在ODBCView類的實(shí)現(xiàn)文件ODBCView.cpp中加入定義對話框類的頭文件:#includeMoveToRecord.h同樣,為了使用工具欄按鈕進(jìn)行快速操作,在工具欄中定義一個Move按鈕,其ID與菜單項“移到第條記錄”的ID一致,Move按鈕的ID為ID_MoveToRecord。,.,33,由于CRecordset類的對象或從CRecordset類繼承的對象都擁有一個m_strSort成員,它決定了對記錄的排序,在“記錄”菜單中增加菜單項“按價格排序”,(ID_SORT_PRICE),并為它映射COMMAND消息處理函數(shù)OnSortPrice()。voidCODBCView: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)菜單項“按價格排序”的功能。,.,34,【例13-5】在【例13-4】的基礎(chǔ)上增加查詢功能,為了編寫查找功能的代碼,增加菜單項“按作者查找”(ID_Search),映射的COMMAND消息處理函數(shù)為OnSearch()。,假設(shè)按“作者”字段進(jìn)行查詢,為菜單項“按作

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論