VC++以ADO方式串連SQL SERVER
一、引用ADO庫
用#import引入ADO庫檔案,在程式的標頭檔中引用它(例如:stdafx.h)。
#import "C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
二、初始化COM庫
::CoInitialize(NULL);
三、使用ADO庫中採用的介面
ADO庫包含三個基本介面:_ConnectionPtr介面、_CommandPtr介面和_RecordsetPtr介面。
_ConnectionPtr介面返回一個記錄集或一個null 指標。通常使用它來建立一個資料連線或執行一條不返回任何結果的SQL語句,如一個預存程序。使用_ConnectionPtr介面返回一個記錄集不是一個好的使用方法。通常同CDatabase一樣,使用它建立一個資料連線,然後使用其它對象執行資料輸入輸出操作。
_CommandPtr介面返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的預存程序和SQL語句。在使用_CommandPtr介面時,你可以利用全域_ConnectionPtr介面,也可以在_CommandPtr介面裡直接使用串連串。如果你只執行一次或幾次資料訪問操作,後者是比較好的選擇。但如果你要頻繁訪問資料庫,並要返回很多記錄集,那麼,你應該使用全域_ConnectionPtr介面建立一個資料連線,然後使用_CommandPtr介面執行預存程序和SQL語句。
_RecordsetPtr是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,遊標控制等。同_CommandPtr介面一樣,它不一定要使用一個已經建立的資料連線,可以用一個串連串代替串連指標賦給_RecordsetPtr的connection成員變數,讓它自己建立資料連線。如果你要使用多個記錄集,最好的方法是同Command對象一樣使用已經建立了資料連線的全域_ConnectionPtr介面,然後使用_RecordsetPtr執行預存程序和SQL語句。
1、使用_ConnectionPtr串連資料庫(兩種方式)
串連資料庫代碼
在程式標頭檔中,定義對象
_ConnectionPtr m_pConnection;//連線物件
在程式中,串連資料庫的程式如下:
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance(_T("ADODB.Connection"));//建立Connection對象
if(SUCCEEDED(hr))
{
hr = m_pConnection->Open("Provider=SQLOLEDB;Data Source=servername;SERVER=database;UID=sa;PWD=;","","",adModeUnknown);
//這是採用非DSN方式串連資料庫字串,其中servername,"資料庫伺服器名";database,"資料庫名";UID,"使用者名稱";PWD,"密碼";
//hr=m_pConnection->Open("DSN=database;UID=sa;PWD=;","","",adModeUnknown);
//這是採用DSN方式串連資料庫字串,其中database,"在DSN中定義的資料來源"
}
else
{
AfxMessageBox(_T("串連不成功!"));
}
}
catch(_com_error e)///捕捉異常
{
CString errormessage;
errormessage.Format(_T("串連資料庫失敗!\r\n錯誤資訊:%s"),e.ErrorMessage());
AfxMessageBox(errormessage);///顯示錯誤資訊
}
2、使用_RecordsetPtr介面
擷取表資料代碼
_RecordsetPtr MySet; //定義記錄集對象
MySet.CreateInstance(__uuidof(Recordset));
MySet->Open("SELECT * FROM some_table",m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
//下面代碼我們用_RecordsetPtr介面擷取記錄集資料並填充這個ListBox控制項(m_list):
_variant_t Holder
try{
while(!MySet->adoEOF)
{
Holder = MySet->GetCollect("FIELD_1"); //資料庫中表欄位名
if(Holder.vt!=VT_NULL)
m_List.AddString((char*)_bstr_t(Holder));
MySet->MoveNext();
}
}
catch(_com_error * e)
{
CString Error = e->ErrorMessage();
AfxMessageBox(e->ErrorMessage());
}
3、使用_CommandPtr介面
以命令及資料集方式擷取表中資料代碼
_CommandPtr pCommand;
_RecordsetPtr MySet;
pCommand.CreateInstance(__uuidof(Command));
pCommand->ActiveConnection=m_pConnection;
pCommand->CommandText="select * from some_table";
pCommand->CommandType=adCmdText;
pCommand->Parameters->Refresh();
MySet=pCommand->Execute(NULL,NULL,adCmdUnknown);
_variant_t TheValue = MySet->GetCollect("FIELD_1");
CString sValue=(char*)_bstr_t(TheValue);
4、資料類型轉換
由於COM對象是跨平台的,它使用了一種通用的方法來處理各種類型的資料,因此CString 類和COM對象是不相容的,我們需要一組API來轉換COM對象和C++類型的資料。_vatiant_t和_bstr_t就是這樣兩種對象。它們提供了通用的方法轉換COM對象和C++類型的資料。