VC6 0中使用ADO操作Access資料庫

2021-04-13 07:45:51 字數 4399 閱讀 8174

ado提供了一組非常簡單,將一般通用的資料訪問細節進行封裝的物件。由於odbc資料來源也提供了一般的ole db privider,所以ado不僅可以應用自身的ole db privider,而且還可以應用所有的odbc驅動程式。關於ole db和ado的其它詳細情況,讀者可以自行查閱相關書籍或msdn,這裡就不一一說明了。讓我們直接步入主題,如何掌握ado這種資料庫訪問技術ado的操作方法和前面講過的dao的操作在很多方面存在相似之處,在這裡,筆者為了更有效的說明它的使用方法,用vc6.0做了乙個示例程式(adorwaccess),這個示例程式可以直接通過ado來操作access資料庫,示例程式的執行效果如下圖所示:

在示例程式中我們仍採用原庫結構,資料庫名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

catch(_com_error e)

關閉乙個庫連線 如果連線狀態有效,則用close方法關閉它並賦於它空值。**如下所示:

if(m_pconnection->state)

m_pconnection->close();

m_pconnection= null;

2. _recordsetptr智慧型指標,可以用來開啟庫內資料表,並可以對錶內的記錄、欄位等進行各種操作。 

開啟資料表開啟庫內表名為demotable的資料表,**如下:

讀取表內資料將表內資料全部讀出並顯示在列表框內,m_accesslist為列表框的成員變數名。如果沒有遇到表結束標誌adoeof,則用getcollect(欄位名)或m_precordset->fields->getitem(欄位名)->value方法,來獲取當前記錄指標所指的字段值,然後再用movenext()方法移動到下一條記錄位置。**如下所示:

_variant_t var;

cstring strname,strage;

try// 讀入庫中各字段並加入列表框中

while(!m_precordset->adoeof)

// 預設列表指向第一項,同時移動記錄指標並顯示

m_accesslist.setcursel(0);

}catch(_com_error *e)

插入記錄可以先用addnew()方法新增乙個空記錄,再用putcollect(欄位名,值)輸入每個欄位的值,最後再update()更新到庫中資料既可。其中變數m_name和m_age分別為姓名及年齡編輯框的成員變數名。**所下所示:

trycatch(_com_error *e)

移動記錄指標 移動記錄指標可以通過movefirst()方法移動到第一條記錄、movelast()方法移動到最後一條記錄、moveprevious()方法移動到當前記錄的前一條記錄、movenext()方法移動到當前記錄的下一條記錄。但我們有時經常需要隨意移動記錄指標到任意記錄位置時,可以使用move(記錄號)方法來實現,注意: move()方法是相對於當前記錄來移動指標位置的,正值向後移動、負值向前移動,如:move(3),當前記錄是3時,它將從記錄3開始往後再移動3條記錄位置。**如下所示:

trycatch(_com_error *e)

改記錄中字段值 可以將記錄指標移動到要修改記錄的位置處,直接用putcollect(欄位名,值)將新值寫入並update()更新資料庫既可。可以用上面方法移動記錄指標,修改字段值**如下所示:

trycatch(_com_error *e)

刪除記錄刪除記錄和上面修改記錄的操作類似,先將記錄指標移動到要修改記錄的位置,直接用delete()方法刪除它並用update()來更新資料庫既可。**如下所示:

trycatch(_com_error *e)

關閉記錄集直接用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->commandtext = "select * from demotable"; // sql語句

m_precordset = m_pcommand->execute(null, null,adcmdtext); // 執行sql語句,返回記錄集

執行儲存過程執行儲存過程的操作和上面執行sql語句類似,不同點僅是commandtext引數中不再是sql語句,而是儲存過程的名字,如demo。另乙個不同點就是在execute()中引數由adcmdtext(執行sql語句),改為adcmdstoredproc來執行儲存過程。如果儲存過程中存在輸入、輸出引數的話,需要使用到另乙個智慧型指標_parameterptr來逐次設定要輸入、輸出的引數資訊,並將其賦於_commandptr中parameters引數來傳遞資訊,有興趣的讀者可以自行查詢相關書籍或msdn。執行儲存過程的**如下所示:

_commandptr m_pcommand;

m_pcommand.createinstance(__uuidof(command));

m_pcommand->activeconnection = m_pconnection; // 將庫連線賦於它

m_pcommand->commandtext = "demo";

m_pcommand->execute(null,null, adcmdstoredproc);

VC6 0中使用ADO操作Access資料庫

由於我的程式只是簡單的儲存 和標題,access小而簡單,所以就選擇access作為本小軟體的資料庫,並採用ado訪問資料庫。以下資料庫內容摘自孫鑫老師的 vc20講第20課資料庫訪問的ppt 資料庫訪問技術 1.odbc open database connectivity 開放資料庫互連。odb...

VC6 0中使用ADO操作Access資料庫

這個版本比原先發的要更加全面一些,以下的 均經過驗證。準備 1 引入ado類 import c program files common files system ado msado15.dll no namespace rename eof adoeof 2 初始化com 在mfc中可以用afxo...

VC6 0中使用64位整型

vc6.0通常用於編寫32位的程式,但是偶爾也需要用到64位整型以實現更精確的計算,在vc6.0中64位整型是用 int64定義的,如下為使用該型別資料計算階乘求和的乙個例子。需要注意的是printf要輸出64位整型數,引數應為 i64u。include int main printf i64u n...