ADO提供了一組非常簡單,將一般通用的數據訪問細節進行封裝的對象。由於ODBC數據源也提供了一般的OLE DB Privider,所以ADO不僅可以應用自身的OLE DB Privider,而且還可以應用所有的ODBC驅動程序。關於OLE DB和ADO的其它詳細情況,讀者可以自行查閱相關書籍或MSDN,這裡就不一一說明了。讓我們直接步入主題,如何掌握ADO這種數據庫訪問技術ADO的操作方法和前面講過的DAO的操作在很多方面存在相似之處,在這裡,筆者為了更有效的說明它的使用方法,用VC6.0做了一個示例程序(AdoRWAccess),這個示例程序可以直接通過ADO來操作Access數據庫,示例程序的運行效果如下圖所示:
·Access數據庫技術(51)
·Access數據庫開發技巧
·VC++中使用ADO方式操作Access數據庫
·基於Access數據庫的抽獎系統設計
·九法防止Access數據庫被下載的
·ASP.Net的Access數據庫操作類
·VB6.0 中連接加密的Access數據庫
·Access數據庫技術(33)
·用MFC ODBC操作Access數據庫
·Access數據庫技術(30)
在示例程序中我們仍采用原庫結構,數據庫名Demo.mdb,庫內表名DemoTable,表內字段名為Name(姓名)和Age(年齡)的兩個字段,來構造示例程序操作所需的Access數據庫,這也和上兩篇文章的示例源碼中的庫結構相兼容。
。
下面讓我們看看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智能指針,可以用來打開庫內數據表,並可以對表內的記錄、字段等進行各種操作。
·Access數據庫技術(51)
·Access數據庫開發技巧
·VC++中使用ADO方式操作Access數據庫
·基於Access數據庫的抽獎系統設計
·九法防止Access數據庫被下載的
·ASP.Net的Access數據庫操作類
·VB6.0 中連接加密的Access數據庫
·Access數據庫技術(33)
·用MFC ODBC操作Access數據庫
·Access數據庫技術(30)
打開數據表 打開庫內表名為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()方法移動到下一條記錄位置。代碼如下所示:
_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("Name");
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.SetCurSel(0);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}