使用ADO
1 概述
ADO是ActiveX數據對象(ActiveX Data Object),這是Microsoft開發數據庫
應用程序的面向對象的新接口。ADO訪問數據庫是通過訪問OLE DB數據提供程
序來進行的,提供了一種對OLE DB數據提供程序的簡單高層訪問接口。
ADO技術簡化了OLE DB的操作,OLE DB的程序中使用了大量的COM接口,而ADO封
裝了這些接口。所以,ADO是一種高層的訪問技術。
ADO技術基於通用對象模型(COM),它提供了多種語言的訪問技術,同時,
由於ADO提供了訪問自動化接口,所以,ADO可以用描述的腳本語言來訪問
VBScript,VCScript等。
2 在VC中使用ADO
可以使用VC6提供的ActiveX控件開發應用程序,還可以用ADO對象開發應用程序。
使用ADO對象開發應用程序可以使程序開發者更容易地控制對數據庫的訪問,從
而產生符合用戶需求的數據庫訪問程序。
使用ADO對象開發應用程序也類似其它技術,需產生與數據源的連接,創建記
錄等步驟,但與其它訪問技術不同的是,ADO技術對對象之間的層次和順序關系
要求不是太嚴格。在程序開發過程中,不必選建立連接,然後才能產生記錄
對象等。可以在使用記錄的地方直接使用記錄對象,在創建記錄對象的同時,
程序自動建立了與數據源的連接。這種模型有力的簡化了程序設計,增強了程
序的靈活性。下面講述使用ADO對象進行程序設計的方法。
21 引入ADO庫文件
使用ADO前必須在工程的stdafx.h文件裡用直接引入符號#import引入ADO庫文
件,以使編譯器能正確編譯。代碼如下所示:
#define INITGUID
#import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","EndOfFile")
#include "icrsint.h"
這行語句聲明在工程中使用ADO,但不使用ADO的名字空間,並且為了避免
沖突,將EOF改名為EndOfFile。
22 初始化ADO環境
在使用ADO對象之前必須先初始化COM環境。初始化COM環境可以用以下代碼完成:
::CoInitialize(NULL);
在初始化COM環境後,就可以使用ADO對象了,如果在程序前面沒有添加此代
碼,將會產生COM錯誤。
在使用完ADO對象後,需要用以下的代碼將初始化的對象釋放:
::CoUninitialize();
此函數清除了為ADO對象准備的COM環境。
23 接口簡介
ADO庫包含三個基本接口:
__ConnectionPtr接口、
__CommandPtr接口、
__RecordsetPtr接口,
__ConnectionPtr接口返回一個記錄集或一個空指針。通常使用它來創建一個
數據連接或執行一條不返回任何結果的SQL語句,如一個存儲過程。
用__ConnectionPtr接口返回一個記錄集不是一個好的使用方法。通常
同CDatabase一樣,使用它創建一個數據連接,然後使用其它對象執行數
據輸入輸出操作。
__CommandPtr接口返回一個記錄集。它提供了一種簡單的方法來執行返回記錄
集的存儲過程和SQL語句。在使用__CommandPtr接口時,可以利用全
局__ConnectionPtr接口,也可以在__CommandPtr接口裡直接使用連接串。如
果只執行一次或幾次數據訪問操作,後者是比較好的選擇。但如果要頻繁訪問
數據庫,並要返回很多記錄集,那麼,應該使用全局__ConnectionPtr接口創
建一個數據連接,然後使用__CommandPtr接口執行存儲過程和SQL語句。
__RecordsetPtr是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了
更多的控制功能,如記錄鎖定,游標控制等。同__CommandPtr接口一樣,它不
一定要使用一個已經創建的數據連接,可以用一個連接串代替連接指針賦
給__RecordsetPtr的connection成員變量,讓它自己創建數據連接。如果要使
用多個記錄集,最好的方法是同Command對象一樣使用已經創建了數據連接的全
局—ConnectionPtr接口,然後使用__Recordse7tPtr執行存儲過程和SQL語句。
24 使用ADO訪問數據庫
__ConnectionPtr是一個連接接口,首先創建一個__ConnectionPtr接口實例,
接著指向並打開一個ODBC數據源或OLE DB數據提供者(Provider)。以下代碼分
別創建一個基於DSN和非DSN的數據連接。
//使用__ConnectionPtr(基於DSN)
__ConnectionPtr MyDb;
MyDb.CreateInstance(__uuidof(Connection));
MyDb-〉Open("DSN=samp;UID=admin;PWD=admin","","",-1);
//使用—ConnectionPtr (基於非DSN)
__ConnectionPtr MyDb;
MyDb.CreateInstance(__uuidof(Connection));
MyDb.Open("Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID=admin;PWD=admin","","",-1);
//使用__RecordsetPtr執行SQL語句
__RecordsetPtr MySet;