1. 程式人生 > >ADO(ActiveX Data Objects)微軟提供的一種資料庫訪問技術

ADO(ActiveX Data Objects)微軟提供的一種資料庫訪問技術

ADO資料庫訪問技術使用的基本步驟及方法:
    首先,要用#import語句來引用支援ADO的元件型別庫(*.tlb),其中型別庫可以作為可執行程式(DLL、EXE等)的一部分被定位在其自身程式中的附屬資源裡,如:被定位在msado15.dll的附屬資源中,只需要直接用#import引用它既可。可以直接在Stdafx.h檔案中加入下面語句來實現:
#import "c:\program files\common files\system\ado\msado15.dll" \
 no_namespace \
 rename ("EOF", "adoEOF")
其中路徑名可以根據自己系統安裝的ADO支援檔案的路徑來自行設定。當編譯器遇到#import語句時,它會為引用元件型別庫中的介面生成包裝類,#import語句實際上相當於執行了API涵數LoadTypeLib()。#import語句會在工程可執行程式輸出目錄中產生兩個檔案,分別為*.tlh(型別庫標頭檔案)及*.tli(型別庫實現檔案),它們分別為每一個介面產生智慧指標,併為各種介面方法、列舉型別,CLSID等進行宣告,建立一系列包裝方法。語句no_namespace說明ADO物件不使用名稱空間,rename ("EOF", "adoEOF")說明將ADO中結束標誌EOF改為adoEOF,以避免和其它庫中命名相沖突。
    其次,在程式初始過程中需要初始化元件,一般可以用CoInitialize(NULL);來實現,這種方法在結束時要關閉初始化的COM,可以用下面語句CoUnInitialize();來實現。在MFC中還可以採用另一種方法來實現初始化COM,這種方法只需要一條語句便可以自動為我們實現初始化COM和結束時關閉COM的操作,語句如下所示: AfxOleInit();
    接著,就可以直接使用ADO的操作了。我們經常使用的只是前面用#import語句引用型別庫時,生成的包裝類.tlh中宣告的智慧指標中的三個,它們分別是_ConnectionPtr、_RecordsetPtr和_CommandPtr。下面分別對它們的使用方法進行介紹:
1、_ConnectionPtr智慧指標,通常用於開啟、關閉一個庫連線或用它的Execute方法來執行一個不返回結果的命令語句(用法和_CommandPtr中的Execute方法類似)。
——開啟一個庫連線。先建立一個例項指標,再用Open開啟一個庫連線,它將返回一個IUnknown的自動化介面指標。程式碼如下所示:
_ConnectionPtr m_pConnection;
// 初始化COM,建立ADO連線等操作
AfxOleInit();
m_pConnection.CreateInstance(__uuidof(Connection));

// 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤資訊,
// 因為它有時會經常出現一些意想不到的錯誤。jingzhou xu
try                 
{ 
 // 開啟本地Access庫Demo.mdb
 m_pConnection->Open("Provider=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= NULL;
2、_RecordsetPtr智慧指標,可以用來開啟庫內資料表,並可以對錶內的記錄、欄位等進行各種操作。
——開啟資料表。開啟庫內表名為DemoTable的資料表,程式碼如下:
_RecordsetPtr m_pRecordset;
m_pRecordset.CreateInstance(__uuidof(Recordset));

// 在ADO操作中建議語句中要常用try...catch()來捕獲錯誤資訊,
// 因為它有時會經常出現一些意想不到的錯誤。jingzhou xu
try
{
 m_pRecordset->Open("SELECT * FROM DemoTable",                // 查詢DemoTable表中所有欄位
      theApp.m_pConnection.GetInterfacePtr(),  // 獲取庫接庫的IDispatch指標
      adOpenDynamic,
      adLockOptimistic,
      adCmdText);
}
catch(_com_error *e)
{
 AfxMessageBox(e->ErrorMessage());
}
——讀取表內資料。將表內資料全部讀出並顯示在列表框內,m_AccessList為列表框的成員變數名。如果沒有遇到表結束標誌adoEOF,則用GetCollect(欄位名)或m_pRecordset->Fields->GetItem(欄位名)->Value方法,來獲取當前記錄指標所指的欄位值,然後再用MoveNext()方法移動到下一條記錄位置。程式碼如下所示: