關於ADO資料庫連線方面知識的總結

2021-06-21 22:02:05 字數 4868 閱讀 8041



關於ado資料庫連線方面知識的總結

1、導入庫檔案

使用ado前必須在工程的stdafx.h檔案最後用直接引入符號#import引入ado庫檔案,以使編譯器能正確編譯。**如下:

#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("eof","endoffile") rename("bof","firstoffile")

或:#import   "c:\\program files\\common files\\system\\ado\\msado15.dll"     rename("eof","adoeof")   

using   namespace   adodb;

ado類的定義是作為一種資源儲存在ado dll(msado15.dll)中,在其內部稱為型別庫。

型別庫描述了自治介面,以及c++使用的com vtable介面。

當使用#import指令時,在執行時visual c++需要從ado dll中讀取這個型別庫,

並以此建立一組c++標頭檔案。這些標頭檔案具有.tli 和.tlh副檔名,#import引入ado庫檔案的**編譯後,在專案的目錄下生成了這兩個檔案。在c++程式**中呼叫的ado類要在這些檔案中定義。

程式的第三行指示ado物件不使用命名空間,在有些應用程式中,

由於應用程式中的物件與ado中的物件之間可能會出現命名衝突,所以有必要使用命名空間。

如果要使用命名空間,則可把第三行程式修改為: rename_namespace("adons")。

第四行**將ado中的eof(檔案結束)更名為adoeof,因為檔案的結尾也是以eof結尾的,是為了避免與定義了自己的eof的其他庫衝突。 至於改為什麼名字,可以根據自己的命名習慣自己確定。

2、初始化com環境

ole db 是基於com技術編寫的,ado是ole db基礎之上的使用者程式,

ole db是乙個com元件,在訪問com元件的時候需要初始化com庫,方法如下:

(1)  ::coinitialize(null); //初始化ole/com庫環境

//對資料庫的訪問在上下**之間寫,下面第三步就應該寫在這裡

::couninitialize();//既然初始化了環境,當然一定要記得釋放他了

(2)也可以呼叫mfc全域性函式

afxoleinit();

3、三大指標物件的定義和建立例項

(1)

_connectionptr pconnection("adodb.connection");

_recordsetptr precordset("adodb.recordset");

_commandptr pcommand("adodn.command");

(2)

_connectionptr pconnection;

_recordsetptr precordset;

_commandptr pcommand;

pconnection.createinstance(__uuidof(connection));

precordset.createinstance(__uuidof(recordset));

pcommand.createinstance(__uuidof(command));

要產生乙個智慧型指標物件,其實在定義的同時也可以初始化,如:

_connectionptr pconnection(__uuidof(connection));

_connectionptr 是智慧型指標

__uuidof() 用來獲取connection全域性唯一識別符號

(3)

_connectionptr pconnection;

_recordsetptr precordset;

_commandptr pcommand;

pconnection.createinstance("adodb.connection");

precordset.createinstance("adodb.recordset");

pcommand.createinstance("adodb.command");

4、開啟乙個連線

pconnection->connectionstring = "這裡的字串有下面四種寫法";//對連線字串賦值

pconnection->open(connectionstring,"","",admodeunknown); //連線資料庫

第二三個引數分別為使用者的id與密碼,

因為在連線字串connectioncstring中已經設定好了,這裡可以為空。

第四個引數可以取下面兩個引數:

adasyncconnect

非同步開啟資料庫,在asp中直接用16

adconnectunspecified

同步開啟資料庫,在asp中直接用-1

connectionstring根據不同的資料來源,分別對應不同的寫法

(要記下來很困難,可以在vb中利用ado控制項先連線好,再將其拷貝在vc中,這樣不容易出錯) 1)

訪問access 2000

"provider=microsoft.jet.oledb.4.0;data source=databasename;user id=username;password=userpassword"

2) 訪問odbc資料

"provider=madasql;dsn=dsnname;uid=username;pwd=userpassword;"

3) 訪問oracle資料庫

「provider=msdaora;data sourse=servername;user id=username;password=userpassword;"

4) 訪問ms sql資料庫

"provider=sqloledb,data source=servername;initial catalog=databasename;user id=username;password=userpassword;"

5、執行sql命令,得到資料

方法1:

precordset = pconnection->execute("select * from authors",null,adcmdtext);

方法2:

precordset ->open("select * from authors",_

variant_t((idispacth*) pconnection), //

設定活動連線

adopendynamtic,

//游標型別

adlockoptimistic,

//鎖的型別

adcmdtext);

方法3:

pcommand->put_activeconnection(_variant_t((idispatch *) pconn);

pcommand->commandtext = "select * from authors";

precordset = pcmd->execute(null,null,adcmdtext);

得到資料之後,做乙個迴圈取得資料:

while (!precordset ->adoeof)

sql命令比較多,但是不去考慮細節,這裡只說出通用的方法

cstring strsql;//定義sql命令串,用來儲存sql語句

strsql.format("sql statement");

然後在每個要用到sql命令串的方法中,使用strsql.allocsysstring()的方法進行型別轉換

6、com的專用資料型別

variant ,bstr ,safearray

variant變數的範圍包括很多,它是一種變體型別,主要用於支援自動化的語言訪問,

從而在vb中非常方便地使用,但是vc中比較複雜,它使用_variant_t 進行管理

bstr是一種字串變數,使用_bstr_t進行管理,這個類過載了char *操作符

7、關閉連線

if(pconnection->state)

;    

//不能多次關閉,否則會出現錯誤

pconnection->close();

precordset->close();

pcommand.release();

pconnection.release();

//釋放引用計數

precordset.release();

注意:呼叫close()時用"->",呼叫release()時要用".",為什麼?

因為智慧型指標,_connectionptr是乙個過載了->運算子的類

_connectionptr:它是乙個介面指標模板。'.'是模板_com_ptr的函式。->是'介面函式'呼叫。

//forexample:

_connectionptr m_conn;

m_conn.createinstance(....);//createinte***ceinstance.

m_conn->open(...);//openaconnectiontodatabase.

'->'是_com_ptr過載了的運算子.目的就是為了讓你呼叫模板引數的函式.

8、結構化異常處理

ado封裝了com介面,所以需要進行錯誤處理

如下例:

hresult hr;

try

} catch(_com_error e)///捕捉異常

這裡介紹了三種物件通過ado訪問資料庫,它們都可以執行sql語句獲取資料,但不是管那種方法獲取資料,最終都將資料放置到記錄集物件當中。

**:

ADO 資料庫連線

這些天一直在學習ado 資料庫連線,感覺比較複雜,所以一邊學習,一邊使用,一邊做了一些筆記,下面的一些東西就是我總結的一些關於ado 1 導入庫檔案 使用ado前必須在工程的stdafx.h檔案最後用直接引入符號 import引入ado庫檔案,以使編譯器能正確編譯。如下 import c progr...

ADO 資料庫連線

這些天一直在學習ado 1 導入庫檔案 使用ado前必須在工程的stdafx.h檔案最後用直接引入符號 import引入ado庫檔案,以使編譯器能正確編譯。如下 import c program files common files system ado msado15.dll no namespa...

ADO連線資料庫

2009 05 02 19 06 1.ado物件連線資料庫 建立乙個mfc對話方塊工程 stdafx.h中新增 import c program files common files system ado msado15.dll no namespace rename eof adoeof rena...