




已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
.,1,第13章數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)發(fā),.,2,13.1有關(guān)數(shù)據(jù)庫(kù)的基礎(chǔ)知識(shí),現(xiàn)有的數(shù)據(jù)庫(kù)軟件有很多,如大型數(shù)據(jù)庫(kù)Oracle、SQLServer,小數(shù)據(jù)庫(kù)Access等,都支持關(guān)系模型,數(shù)據(jù)庫(kù)模型,層次模型網(wǎng)狀模型關(guān)系模型面向?qū)ο竽P?.,3,13.2ODBC介紹和引用,.,4,13.2.1ODBC簡(jiǎn)介,MS推出了OpenDatabaseConnectivity,簡(jiǎn)稱ODBC。它包含訪問(wèn)不同數(shù)據(jù)庫(kù)所要求的ODBC驅(qū)動(dòng)程序。只要調(diào)用ODBC所支持的函數(shù),動(dòng)態(tài)鏈接到不同的驅(qū)動(dòng)程序上即可。一個(gè)基于ODBC的應(yīng)用程序?qū)?shù)據(jù)庫(kù)的操作不依賴任何DBMS,不直接與DBMS打交道,所有的數(shù)據(jù)庫(kù)操作由對(duì)應(yīng)的DBMS的ODBC驅(qū)動(dòng)程序完成。也就是說(shuō),不論是Oracle、SQLServer還是Access數(shù)據(jù)庫(kù),均可用ODBCAPI進(jìn)行訪問(wèn)。由此可見(jiàn),ODBC的最大優(yōu)點(diǎn)是能以統(tǒng)一的方式處理所有的數(shù)據(jù)庫(kù)。,.,5,ODBC數(shù)據(jù)源控制臺(tái)就是Windows系統(tǒng)管理數(shù)據(jù)源的控制臺(tái),所有的數(shù)據(jù)庫(kù)驅(qū)動(dòng),以及數(shù)據(jù)源登記都要在此發(fā)布,并向系統(tǒng)發(fā)出請(qǐng)求。通過(guò)使用ODBCAPI和MFCODBC類,可以訪問(wèn)任何數(shù)據(jù)資源。只要應(yīng)用程序的用戶的終端機(jī)器上有ODBC的驅(qū)動(dòng),都可以訪問(wèn)任何地方的數(shù)據(jù)源。ODBC是一種接口,它是通過(guò)相應(yīng)的各個(gè)數(shù)據(jù)庫(kù)的ODBC驅(qū)動(dòng)來(lái)訪問(wèn)各種數(shù)據(jù)庫(kù)中的數(shù)據(jù)。使用ODBC,能夠使應(yīng)用程序獨(dú)立于數(shù)據(jù)庫(kù)的硬件環(huán)境,ODBC提供的API函數(shù)獨(dú)立于數(shù)據(jù)庫(kù)管理系統(tǒng)。,.,6,ODBC是Microsoft的Windows系統(tǒng)下的數(shù)據(jù)庫(kù)服務(wù)的一部分。它是由下面幾個(gè)部分構(gòu)成的:ODBCAPI:包含在一個(gè)動(dòng)態(tài)庫(kù)中的函數(shù)集合、一個(gè)錯(cuò)誤代碼的集合、一個(gè)標(biāo)準(zhǔn)的SQL語(yǔ)句集合,用來(lái)調(diào)用DBMS中的數(shù)據(jù)。ODBCDriverManager:一個(gè)動(dòng)態(tài)庫(kù)文件(ODBC32.DLL)來(lái)加載ODBC驅(qū)動(dòng),這個(gè)DLL對(duì)你的應(yīng)用程序是透明的。ODBCdatabasedrivers:由一個(gè)或是多個(gè)DLL構(gòu)成,其中含有ODBCAPI,這些DLL由其擁有者DBMS調(diào)用。ODBCCursorLibrary:這也是一個(gè)動(dòng)態(tài)連接庫(kù)文件。ODBCAdministrator:這是一個(gè)ODBC控制臺(tái),用來(lái)管理不同的數(shù)據(jù)源。,.,7,13.2.2MFC對(duì)ODBC的封裝,.,8,13.2.3如何訪問(wèn)數(shù)據(jù)庫(kù),建立ODBC數(shù)據(jù)源連接數(shù)據(jù)源選擇和處理記錄數(shù)據(jù)庫(kù)應(yīng)用程序中的文檔和視圖,訪問(wèn)數(shù)據(jù)庫(kù),.,9,13.2.4在數(shù)據(jù)庫(kù)應(yīng)用程序中常用的幾個(gè)類,1CRecordView類,一個(gè)CRecordView對(duì)象就是用一個(gè)視圖中的控件來(lái)顯示數(shù)據(jù)庫(kù)中的記錄。CRecordView類使用了動(dòng)態(tài)數(shù)據(jù)交換(DDX)和數(shù)據(jù)庫(kù)交換(RFX),在視圖上的控件和數(shù)據(jù)源中的數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)交換。AppWizard生成CRecordView和CRecordset類,并和相應(yīng)的數(shù)據(jù)源關(guān)聯(lián)。,.,10,【例13-1】創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序,可以顯示Access數(shù)據(jù)庫(kù)表中的記錄。,.,11,步驟:,1.用AppWizard來(lái)生成一個(gè)單文檔的ODBC工程文件,.,12,選擇已創(chuàng)建好的數(shù)據(jù)庫(kù)My_Access_db.mdb表單,.,13,用ClassWizard給相應(yīng)的EditBox連接變量,注意,在AddMemberVariable對(duì)話框中的下拉組合框中已經(jīng)有了相應(yīng)表中的字段,只要選中相應(yīng)的字段就可以了,.,14,2CRecordset類,為了能夠處理各種的數(shù)據(jù)庫(kù),最好從類CRecordset派生出一個(gè)子類來(lái)。數(shù)據(jù)庫(kù)從數(shù)據(jù)源讀取數(shù)據(jù)后,可以做以下的工作:翻閱所有的記錄。修改記錄,設(shè)定鎖定狀態(tài)。挑選有用的記錄。給數(shù)據(jù)庫(kù)排序。給定參數(shù),讓數(shù)據(jù)庫(kù)在運(yùn)行的時(shí)候自動(dòng)選擇數(shù)據(jù)。,.,15,3CDatabase類,CDatabase在afxdb.h中定義。其對(duì)象是用來(lái)連接一個(gè)數(shù)據(jù)源的。為了使用CDatabase對(duì)象,需調(diào)用構(gòu)造函數(shù),并調(diào)用OpenEx或是Open函數(shù),這將會(huì)打開(kāi)一個(gè)連接。當(dāng)構(gòu)造一個(gè)CDatabase類完成后,可以向CRecordset類的對(duì)象傳遞這個(gè)CDatabase類的指針。連接數(shù)據(jù)源結(jié)束時(shí),必須用Close函數(shù)關(guān)閉這個(gè)對(duì)象。,.,16,4RFX,RFX(RecordFieldExchange)是支持應(yīng)用程序的一個(gè)交換機(jī)制,當(dāng)從CRecordset類派生一個(gè)類,在交換數(shù)據(jù)的時(shí)候沒(méi)有選擇大容量交換的方式(BulkRFX)時(shí),RFX機(jī)制將在數(shù)據(jù)交換中起作用。RFX在視圖和數(shù)據(jù)源之間自動(dòng)交換數(shù)據(jù),由于一次交換的數(shù)據(jù)可能不止一個(gè),為此可能要多次調(diào)用DoFieldExchange函數(shù),同時(shí)它也是應(yīng)用程序框架和ODBC交流的媒介。RFX機(jī)制能夠安全的通過(guò)調(diào)用(例如ODBC函數(shù)SQLBindCol)來(lái)保存用戶的工作。,.,17,下面代碼就是【例13-1】工程文件中AppWizard自動(dòng)加入的RFX代碼,見(jiàn)粗斜體部分:voidCODBCSet:DoFieldExchange(CFieldExchange*pFX)/AFX_FIELD_MAP(CODBCSet)pFX-SetFieldType(CFieldExchange:outputColumn);RFX_Long(pFX,_T(書(shū)籍ID),m_ID);RFX_Text(pFX,_T(作者),m_column1);RFX_Text(pFX,_T(出版社),m_column2);RFX_Text(pFX,_T(價(jià)格),m_column3);/AFX_FIELD_MAP,.,18,函數(shù)DoFieldExchange是RFX機(jī)制的中樞,任何時(shí)候應(yīng)用框架需要從數(shù)據(jù)源到數(shù)據(jù)庫(kù)或是從數(shù)據(jù)庫(kù)到數(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是用來(lái)處理從其它ODBC類傳過(guò)來(lái)的異常情況的。這個(gè)類一般是和關(guān)鍵字CATCH連用的。同樣的用戶也可以用全局函數(shù)AfxThrowDBException拋出一個(gè)異常情況,m_nRetCode:它包含了一個(gè)結(jié)構(gòu)體RETCODE,里面包含了ODBC的錯(cuò)誤信息的描述。m_strError:包含一個(gè)描敘異常情況的字符串。m_strStateNativeOrigin:包含描述異常情況的字符串m_strStateNativeOrigin;如果變量包含多個(gè)錯(cuò)誤的描述,錯(cuò)誤會(huì)分行顯示。,CDBException類的成員變量,.,20,【例13-2】在【例13-1】的基礎(chǔ)上增加“刪除一個(gè)記錄”、“更新記錄”和“清除域”三個(gè)菜單項(xiàng),并實(shí)現(xiàn)相應(yīng)的操作。,響應(yīng)COMMAND命令,響應(yīng)命令UPDATE_COMMAND_UI,1加入菜單項(xiàng),.,21,2重載OnMove函數(shù),.,22,BOOLCODBCView:OnMove(UINTnIDMoveCommand)switch(nIDMoveCommand)caseID_RECORD_PREV:m_pSet-MovePrev();if(!m_pSet-IsBOF()break;/如果移到數(shù)據(jù)庫(kù)的開(kāi)始,自動(dòng)執(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();/刪除了最后一個(gè)記錄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ù)庫(kù)中添加新記錄。,增加一個(gè)菜單項(xiàng)“增加一個(gè)新記錄”,其ID標(biāo)識(shí)為ID_ADD_RECORD,.,27,在數(shù)據(jù)庫(kù)中增加記錄步驟:得到最后一條記錄的ID號(hào)將其加1通過(guò)AddNew函數(shù)來(lái)添加記錄把新的ID值設(shè)置為新增記錄中的ID字段值用Update函數(shù)保存新記錄調(diào)用Requery函數(shù)更新記錄把輸入控制滾動(dòng)到數(shù)據(jù)庫(kù)中的最后一條記錄上,.,28,為了計(jì)算新的ID號(hào),需增加CODBCSet類的成員函數(shù)GetMaxID,longCODBCSet:GetMaxID()MoveLast();/移到最后一條記錄returnm_ID;/返回該ID值,.,29,voidCODBCView:OnAddRecord()CRecordset*pSet=OnGetRecordset();/獲取指向數(shù)據(jù)庫(kù)的指針if(pSet-CanUpdate()/更新表單,.,30,【例13-4】在【例13-3】的基礎(chǔ)上增加瀏覽記錄的功能和對(duì)記錄進(jìn)行排序的功能。創(chuàng)建對(duì)話框,通過(guò)在對(duì)話框中指定記錄序號(hào)(記錄序號(hào)不是記錄的ID號(hào)標(biāo)識(shí))來(lái)瀏覽該條記錄的內(nèi)容。,IDD_MOVE_RECORD,IDC_RECORD_ID,.,31,voidCODBCView:OnMoveToRecord()CMoveToRecorddlgMoveTo;/創(chuàng)建CMoveToRecord類的對(duì)象實(shí)例if(dlgMoveTo.DoModal()=IDOK)CRecordset*pSet=OnGetRecordset();/指向數(shù)據(jù)庫(kù)記錄的指針if(pSet-CanUpdate()/更新表單,.,32,由于在視圖中響應(yīng)了對(duì)話框的操作,因此,還需要在ODBCView類的實(shí)現(xiàn)文件ODBCView.cpp中加入定義對(duì)話框類的頭文件:#includeMoveToRecord.h同樣,為了使用工具欄按鈕進(jìn)行快速操作,在工具欄中定義一個(gè)Move按鈕,其ID與菜單項(xiàng)“移到第條記錄”的ID一致,Move按鈕的ID為ID_MoveToRecord。,.,33,由于CRecordset類的對(duì)象或從CRecordset類繼承的對(duì)象都擁有一個(gè)m_strSort成員,它決定了對(duì)記錄的排序,在“記錄”菜單中增加菜單項(xiàng)“按價(jià)格排序”,(ID_SORT_PRICE),并為它映射COMMAND消息處理函數(shù)OnSortPrice()。voidCODBCView:OnSortPrice()m_pSet-Close();/關(guān)閉數(shù)據(jù)庫(kù)m_pSet-m_strSort=“價(jià)格”;/指定排序字段m_pSet-Open();/再次打開(kāi)數(shù)據(jù)庫(kù)UpdateData(FALSE);/更新已經(jīng)排序過(guò)的記錄由于用了CRecordset類的成員m_strSort,因此對(duì)數(shù)據(jù)庫(kù)記錄的排序不用進(jìn)行太多的代碼干預(yù)。最后在工具欄中增加Sort工具按鈕,實(shí)現(xiàn)菜單項(xiàng)“按價(jià)格排序”的功能。,.,34,【例13-5】在【例13-4】的基礎(chǔ)上增加查詢功能,為了編寫查找功能的代碼,增加菜單項(xiàng)“按作者查找”(ID_Search),映射的COMMAND消息處理函數(shù)為OnSearch()。,假設(shè)按“作者”字段進(jìn)行查詢,為菜單項(xiàng)“按作
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 加強(qiáng)工傷醫(yī)療管理制度
- 醫(yī)療廢物儲(chǔ)存管理制度
- 前期物業(yè)日常管理制度
- 前臺(tái)設(shè)計(jì)招標(biāo)方案(3篇)
- 公用設(shè)施設(shè)備管理制度
- 公司章程公司管理制度
- 咨詢外銷績(jī)效管理制度
- 工作倉(cāng)庫(kù)日常管理制度
- 園林綠化項(xiàng)目管理制度
- 賓館清潔服務(wù)管理制度
- 低年級(jí)繪本閱讀校本課程開(kāi)發(fā)與實(shí)施方案
- 風(fēng)電基礎(chǔ)勞務(wù)分包合同(2篇)
- 駐地建設(shè)臨建設(shè)施驗(yàn)收表
- 絲綢之路完整版本
- 國(guó)家開(kāi)放大學(xué)《光伏電池原理與工藝》形考任務(wù)1-4參考答案
- 作文素材使用指南
- 燃?xì)馍a(chǎn)安全事故應(yīng)急處置工作手冊(cè)
- 人工智能訓(xùn)練師理論知識(shí)考核要素細(xì)目表五級(jí)
- 陜西省西安市數(shù)學(xué)中考2024年試題及答案解析
- 2024-2030年中國(guó)AGV機(jī)器人行業(yè)發(fā)展分析及投資風(fēng)險(xiǎn)與戰(zhàn)略研究報(bào)告
- 2024年重慶市中考生物試卷真題(含標(biāo)準(zhǔn)答案及解析)
評(píng)論
0/150
提交評(píng)論