一ADO簡介 ADO(ActiveX Data Object)是Microsoft數據庫應用程序開發的新接口
是建立在OLE DB之上的高層數據庫訪問技術
請不必為此擔心
即使你對OLE DB
COM不了解也能輕松對付ADO
因為它非常簡單易用
甚至比你以往所接觸的ODBC API
DAO
RDO都要容易使用
並不失靈活性
本文將詳細地介紹在VC下如何使用ADO來進行數據庫應用程序開發
並給出示例代碼
本文示例代碼
二基本流程 萬事開頭難
任何一種新技術對於初學者來說最重要的還是
入門
掌握其要點
讓我們來看看ADO數據庫開發的基本流程吧!
(
)初始化COM庫
引入ADO庫定義文件
(
)用Connection對象連接數據庫
(
)利用建立好的連接
通過Connection
Command對象執行SQL命令
或利用Recordset對象取得結果記錄集進行查詢
處理
(
)使用完畢後關閉連接釋放對象
准備工作:
為了大家都能測試本文提供的例子
我們采用Access數據庫
您也可以直接在我們提供的示例代碼中找到這個test
mdb
下面我們將詳細介紹上述步驟並給出相關代碼
【
】COM庫的初始化
我們可以使用AfxOleInit()來初始化COM庫
這項工作通常在CWinApp::InitInstance()的重載函數中完成
請看如下代碼:
BOOL CADOTest
App::InitInstance()
{
AfxOleInit();
【
】用#import指令引入ADO類型庫
我們在stdafx
h中加入如下語句
(stdafx
h這個文件哪裡可以找到?你可以在FileView中的Header Files裡找到)
#import
c:\program files\common files\system\ado\msado
dll
no_namespace rename(
EOF
adoEOF
)
這一語句有何作用呢?其最終作用同我們熟悉的#include類似
編譯的時候系統會為我們生成msado
tlh
ado
tli兩個C++頭文件來定義ADO庫
幾點說明:
(
) 您的環境中msado
dll不一定在這個目錄下
請按實際情況修改
(
) 在編譯的時候肯能會出現如下警告
對此微軟在MSDN中作了說明
並建議我們不要理會這個警告
msado
tlh(
) : warning C
: unary minus operator applied to unsigned type
result still unsigned
【
】創建Connection對象並連接數據庫
首先我們需要添加一個指向Connection對象的指針:
_ConnectionPtr m_pConnection;
下面的代碼演示了如何創建Connection對象實例及如何連接數據庫並進行異常捕捉
BOOL CADOTest
Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
HRESULT hr;
try
{
hr = m_pConnection
CreateInstance(
ADODB
Connection
);///創建Connection對象
if(SUCCEEDED(hr))
{
hr = m_pConnection
>Open(
Provider=Microsoft
Jet
OLEDB
;Data Source=test
mdb
adModeUnknown);///連接數據庫
///上面一句中連接字串中的Provider是針對ACCESS
環境的
對於ACCESS
需要改為:Provider=Microsoft
Jet
OLEDB
; }
}
catch(_com_error e)///捕捉異常
{
CString errormessage;
errormessage
Format(
連接數據庫失敗!\r\n錯誤信息:%s
e
ErrorMessage());
AfxMessageBox(errormessage);///顯示錯誤信息
}
在這段代碼中我們是通過Connection對象的Open方法來進行連接數據庫的
下面是該方法的原型
HRESULT Connection
::Open ( _bstr_t ConnectionString
_bstr_t UserID
_bstr_t Password
long Options )
ConnectionString為連接字串
UserID是用戶名
Password是登陸密碼
Options是連接選項
用於指定Connection對象對數據的更新許可權
Options可以是如下幾個常量:
adModeUnknown:缺省
當前的許可權未設置
adModeRead:只讀
adModeWrite:只寫
adModeReadWrite:可以讀寫
adModeShareDenyRead:阻止其它Connection對象以讀權限打開連接
adModeShareDenyWrite:阻止其它Connection對象以寫權限打開連接
adModeShareExclusive:阻止其它Connection對象打開連接
adModeShareDenyNone:允許其它程序或對象以任何權限建立連接
我們給出一些常用的連接方式供大家參考:
(
)通過JET數據庫引擎對ACCESS
數據庫的連接
m_pConnection
>Open(
Provider=Microsoft
Jet
OLEDB
;Data Source=C:\\test
mdb
adModeUnknown);
(
)通過DSN數據源對任何支持ODBC的數據庫進行連接:
m_pConnection
>Open(
Data Source=adotest;UID=sa;PWD=;
adModeUnknown);
(
)不通過DSN對SQL SERVER數據庫進行連接
m_pConnection
>Open(
driver={SQL Server};Server=
;DATABASE=vckbase;UID=sa;PWD=
adModeUnknown);
其中Server是SQL服務器的名稱
DATABASE是庫的名稱
Connection對象除Open方法外還有許多方法
我們先介紹Connection對象中兩個有用的屬性ConnectionTimeOut與State
ConnectionTimeOut用來設置連接的超時時間
需要在Open之前調用
例如: m_pConnection
>ConnectionTimeout =
;///設置超時時間為
秒
m_pConnection
>Open(
Data Source=adotest;
adModeUnknown);
State屬性指明當前Connection對象的狀態
表示關閉
表示已經打開
我們可以通過讀取這個屬性來作相應的處理
例如:
if(m_pConnection
>State)
m_pConnection
>Close(); ///如果已經打開了連接則關閉它
【
】執行SQL命令並取得結果記錄集
為了取得結果記錄集
我們定義一個指向Recordset對象的指針:_RecordsetPtr m_pRecordset;
並為其創建Recordset對象的實例: m_pRecordset
CreateInstance(
ADODB
Recordset
);
SQL命令的執行可以采用多種形式
下面我們一進行闡述
(
)利用Connection對象的Execute方法執行SQL命令
Execute方法的原型如下所示:
_RecordsetPtr Connection
::Execute ( _bstr_t CommandText
VARIANT * RecordsAffected
long Options ) 其中CommandText是命令字串
通常是SQL命令
參數RecordsAffected是操作完成後所影響的行數
參數Options表示CommandText中內容的類型
Options可以取如下值之一
adCmdText:表明CommandText是文本命令
adCmdTable:表明CommandText是一個表名
adCmdProc:表明CommandText是一個存儲過程
adCmdUnknown:未知
Execute執行完後返回一個指向記錄集的指針
下面我們給出具體代碼並作說明
_variant_t RecordsAffected;
///執行SQL命令
CREATE TABLE創建表格users
users包含四個字段:整形ID
字符串username
整形old
日期型birthday
m_pConnection
>Execute(
CREATE TABLE users(ID INTEGER
username TEXT
old INTEGER
birthday DATETIME)
&RecordsAffected
adCmdText);
///往表格裡面添加記錄
m_pConnection
>Execute(
INSERT INTO users(ID
username
old
birthday) VALUES (
Washington
/
/
)
&RecordsAffected
adCmdText);
///將所有記錄old字段的值加一
m_pConnection
>Execute(
UPDATE users SET old = old+
&RecordsAffected
adCmdText);
///執行SQL統計命令得到包含記錄條數的記錄集
m_pRecordset = m_pConnection
>Execute(
SELECT COUNT(*) FROM users
&RecordsAffected
adCmdText);
_variant_t vIndex = (long)
;
_variant_t vCount = m_pRecordset
>GetCollect(vIndex);///取得第一個字段的值放入vCount變量
m_pRecordset
>Close();///關閉記錄集
CString message;
message
Format(
共有%d條記錄
vCount
lVal);
AfxMessageBox(message);///顯示當前記錄條數
(
)利用Command對象來執行SQL命令
_CommandPtr m_pCommand;
m_pCommand
CreateInstance(
ADODB
Command
);
_variant_t vNULL;
vNULL
vt = VT_ERROR;
vNULL
scode = DISP_E_PARAMNOTFOUND;///定義為無參數
m_pCommand
>ActiveConnection = m_pConnection;///非常關鍵的一句
將建立的連接賦值給它
m_pCommand
>CommandText =
SELECT * FROM users
;///命令字串
m_pRecordset = m_pCommand
>Execute(&vNULL
&vNULL
adCmdText);///執行命令
取得記錄集
在這段代碼中我們只是用Command對象來執行了SELECT查詢語句
Command對象在進行存儲過程的調用中能真正體現它的作用
下次我們將詳細介紹
(
)直接用Recordset對象進行查詢取得記錄集
例如
m_pRecordset
>Open(
SELECT * FROM users
_variant_t((IDispatch *)m_pConnection
true)
adOpenStatic
adLockOptimistic
adCmdText);
Open方法的原型是這樣的:
HRESULT Recordset
::Open ( const _variant_t & Source
const _variant_t & ActiveConnection
enum CursorTypeEnum CursorType
enum LockTypeEnum LockType
long Options )
其中
①Source是數據查詢字符串
②ActiveConnection是已經建立好的
From:http://tw.wingwit.com/Article/program/net/201311/13775.html