關於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...