通過ADO操作Access數據庫_第1頁
通過ADO操作Access數據庫_第2頁
通過ADO操作Access數據庫_第3頁
通過ADO操作Access數據庫_第4頁
通過ADO操作Access數據庫_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、MFC通過ADO操作Access數據庫我在VC知識庫在線雜志第十四期和第十五期上曾發表了兩篇文章“直接通過ODBC讀、寫Excel表格文件”和“直接通過DAO讀、寫Access文件”,先后給大家介紹了ODBC和DAO兩種數據庫訪問技術的基本使用方法,這次要給大家介紹的是ADO數據庫訪問技術的使用方法。ADO(Active Data Object,活動數據對象)實際上是一種基于COM(組件對象模型)的自動化接口(IDispatch)技術,并以OLE DB(對象連接和鑲入的數據庫)為基礎,經過OLE DB精心包裝后的數據庫訪問技術,利用它可以快速的創建數據庫應用程序。 ADO提供了一組非常簡單,將

2、一般通用的數據訪問細節進行封裝的對象。由于ODBC數據源也提供了一般的OLE DB Privider,所以ADO不僅可以應用自身的OLE DB Privider,而且還可以應用所有的ODBC驅動程序。關于OLE DB和ADO的其它詳細情況,讀者可以自行查閱相關書籍或MSDN,這里就不一一說明了。讓我們直接步入主題:如何掌握ADO這種數據庫訪問技術。ADO的操作方法和前面講過的DAO的操作在很多方面存在相似之處,在這里,筆者為了更有效的說明它的使用方法,用VC6.0做了一個示例程序AdoRWAccess,這個示例程序可以直接通過ADO來操作Access數據庫,示例程序的運行效果如下圖所示: 在示

3、例程序中我們仍采用原庫結構,數據庫名Demo.mdb,庫內表名DemoTable,表內字段名為Name(姓名)和Age(年齡)的兩個字段,來構造示例程序操作所需的Access數據庫,這也和上兩篇文章的示例源碼中的庫結構相兼容。下面讓我們看看ADO數據庫訪問技術使用的基本步驟及方法:    首先,要用#import語句來引用支持ADO的組件類型庫(*.tlb),其中類型庫可以作為可執行程序(DLL、EXE等)的一部分被定位在其自身程序中的附屬資源里,如:被定位在msado15.dll的附屬資源中,只需要直接用#import引用它既可??梢灾苯釉赟tdafx.h文件中

4、加入下面語句來實現:#import "c:program filescommon filessystemadomsado15.dll" no_namespace rename ("EOF", "adoEOF")其中路徑名可以根據自己系統安裝的ADO支持文件的路徑來自行設定。當編譯器遇到#import語句時,它會為引用組件類型庫中的接口生成包裝類,#import語句實際上相當于執行了API涵數LoadTypeLib()。#import語句會在工程可執行程序輸出目錄中產生兩個文件,分別為*.tlh(類型庫頭文件)及*.tli(類型庫實現文

5、件),它們分別為每一個接口產生智能指針,并為各種接口方法、枚舉類型,CLSID等進行聲明,創建一系列包裝方法。語句no_namespace說明ADO對象不使用命名空間,rename ("EOF", "adoEOF")說明將ADO中結束標志EOF改為adoEOF,以避免和其它庫中命名相沖突。    其次,在程序初始過程中需要初始化組件,一般可以用CoInitialize(NULL);來實現,這種方法在結束時要關閉初始化的COM,可以用下面語句CoUnInitialize();來實現。在MFC中還可以采用另一種方法來實現初始化C

6、OM,這種方法只需要一條語句便可以自動為我們實現初始化COM和結束時關閉COM的操作,語句如下所示: AfxOleInit();    接著,就可以直接使用ADO的操作了。我們經常使用的只是前面用#import語句引用類型庫時,生成的包裝類.tlh中聲明的智能指針中的三個,它們分別是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分別對它們的使用方法進行介紹:1、_ConnectionPtr智能指針,通常用于打開、關閉一個庫連接或用它的Execute方法來執行一個不返回結果的命令語句(用法和_CommandPtr中的Execu

7、te方法類似)。打開一個庫連接。先創建一個實例指針,再用Open打開一個庫連接,它將返回一個IUnknown的自動化接口指針。代碼如下所示: _ConnectionPtr m_pConnection;/ 初始化COM,創建ADO連接等操作AfxOleInit();m_pConnection.cc(_uuidof(Connection);/ 在ADO操作中建議語句中要常用try.catch()來捕獲錯誤信息,/ 因為它有時會經常出現一些意想不到的錯誤。jingzhou xutry / 打開本地Access庫Demo.mdb m_pConnection->Open("Provide

8、r=Microsoft.Jet.OLEDB.4.0;Data Source=Demo.mdb","","",adModeUnknown);catch(_com_error e) AfxMessageBox("數據庫連接失敗,確認數據庫Demo.mdb是否在當前路徑下!"); return FALSE;關閉一個庫連接。如果連接狀態有效,則用Close方法關閉它并賦于它空值。代碼如下所示: if(m_pConnection->State) m_pConnection->Close();m_pConnection= N

9、ULL;2、_RecordsetPtr智能指針,可以用來打開庫內數據表,并可以對表內的記錄、字段等進行各種操作。打開數據表。打開庫內表名為DemoTable的數據表,代碼如下: _RecordsetPtr m_pRecordset;m_pRecordset.CreateInstance(_uuidof(Recordset);/ 在ADO操作中建議語句中要常用try.catch()來捕獲錯誤信息,/ 因為它有時會經常出現一些意想不到的錯誤。jingzhou xutry m_pRecordset->Open("SELECT * FROM DemoTable", / 查詢D

10、emoTable表中所有字段 theApp.m_pConnection.GetInterfacePtr(), / 獲取庫接庫的IDispatch指針 adOpenDynamic, adLockOptimistic, adCmdText);catch(_com_error *e) AfxMessageBox(e->ErrorMessage();讀取表內數據。將表內數據全部讀出并顯示在列表框內,m_AccessList為列表框的成員變量名。如果沒有遇到表結束標志adoEOF,則用GetCollect(字段名)或m_pRecordset->Fields->GetItem(字段名)-

11、>Value方法,來獲取當前記錄指針所指的字段值,然后再用MoveNext()方法移動到下一條記錄位置。代碼如下所示: _variant_t var;CString strName,strAge; try if(!m_pRecordset->BOF) m_pRecordset->MoveFirst(); else AfxMessageBox("表內數據為空"); return; / 讀入庫中各字段并加入列表框中 while(!m_pRecordset->adoEOF) var = m_pRecordset->GetCollect("N

12、ame"); if(var.vt != VT_NULL) strName = (LPCSTR)_bstr_t(var); var = m_pRecordset->GetCollect("Age"); if(var.vt != VT_NULL) strAge = (LPCSTR)_bstr_t(var); m_AccessList.AddString( strName + " -> "+strAge ); m_pRecordset->MoveNext(); / 默認列表指向第一項,同時移動記錄指針并顯示 m_AccessList

13、.SetCurSel(0); catch(_com_error *e) AfxMessageBox(e->ErrorMessage(); 插入記錄??梢韵扔肁ddNew()方法新增一個空記錄,再用PutCollect(字段名,值)輸入每個字段的值,最后再Update()更新到庫中數據既可。其中變量m_Name和m_Age分別為姓名及年齡編輯框的成員變量名。代碼所下所示: try / 寫入各字段值 m_pRecordset->AddNew(); m_pRecordset->PutCollect("Name", _variant_t(m_Name); m_pR

14、ecordset->PutCollect("Age", atol(m_Age); m_pRecordset->Update(); AfxMessageBox("插入成功!"); catch(_com_error *e) AfxMessageBox(e->ErrorMessage(); 移動記錄指針。移動記錄指針可以通過MoveFirst()方法移動到第一條記錄、MoveLast()方法移動到最后一條記錄、MovePrevious()方法移動到當前記錄的前一條記錄、MoveNext()方法移動到當前記錄的下一條記錄。但我們有時經常需要隨意

15、移動記錄指針到任意記錄位置時,可以使用Move(記錄號)方法來實現,注意: Move()方法是相對于當前記錄來移動指針位置的,正值向后移動、負值向前移動,如:Move(3),當前記錄是3時,它將從記錄3開始往后再移動3條記錄位置。代碼如下所示: try int curSel = m_AccessList.GetCurSel(); / 先將指針移向第一條記錄,然后就可以相對第一條記錄來隨意移動記錄指針 m_pRecordset->MoveFirst(); m_pRecordset->Move(long(curSel); catch(_com_error *e) AfxMessageB

16、ox(e->ErrorMessage(); 修改記錄中字段值??梢詫⒂涗浿羔樢苿拥揭薷挠涗浀奈恢锰?,直接用PutCollect(字段名,值)將新值寫入并Update()更新數據庫既可??梢杂蒙厦娣椒ㄒ苿佑涗浿羔?,修改字段值代碼如下所示: try / 假設對第二條記錄進行修改 m_pRecordset->MoveFirst(); m_pRecordset->Move(1); / 從0開始 m_pRecordset->PutCollect("Name", _variant_t(m_Name); m_pRecordset->PutCollect(&

17、quot;Age", atol(m_Age); m_pRecordset->Update(); catch(_com_error *e) AfxMessageBox(e->ErrorMessage(); 刪除記錄。刪除記錄和上面修改記錄的操作類似,先將記錄指針移動到要修改記錄的位置,直接用Delete()方法刪除它并用Update()來更新數據庫既可。代碼如下所示: try / 假設刪除第二條記錄 m_pRecordset->MoveFirst(); m_pRecordset->Move(1); / 從0開始 m_pRecordset->Delete(a

18、dAffectCurrent); / 參數adAffectCurrent為刪除當前記錄 m_pRecordset->Update(); catch(_com_error *e) AfxMessageBox(e->ErrorMessage(); 關閉記錄集。直接用Close方法關閉記錄集并賦于其空值。代碼如下所示: m_pRecordset->Close(); m_pRecordset = NULL;3、CommandPtr智能指針,可以使用_ConnectionPtr或_RecordsetPtr來執行任務,定義輸出參數,執行存儲過程或SQL語句。 執行SQL語句。先創建一個_CommandPtr實例指針,再將庫連接和SQL語句做為參數,執行Execute()方法既可。代碼如下所示: _CommandPtr m_pCommand;m_pCommand.CreateInstance(_uuidof(Command);m_pCommand->ActiveConnection = m_pConnection; / 將庫連接賦于它m_pCommand->Comm

溫馨提示

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

評論

0/150

提交評論