這篇文章不是介紹ADO串連資料庫的原理的,而是寫一下串連的步驟和簡便方法。
一、擷取連接字串。
串連資料庫時需要用到 _ConnectionPtr 對象的open方法,參數如下:
HRESULT Connection15::Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, _bstr_t Options)
在寫這個ConnectionString連接字串時,有的人感覺很困難,下面是一種簡單的方法來獲得這個連接字串。
1.1 建立一個.udl的檔案,開啟,在提供的程式選項中選擇Microsoft OLE DB Provider for SQL Server 然後下一步。如:
1.2 在串連中填寫必要的資訊後,點擊測試連接,如果成功會出現如所示的提示框。
其中的伺服器名稱就是你SQL Server伺服器的名稱,如果不知道,可以在SQL Server中的伺服器屬性中看到,如:
二、下面貼出控制台程式,說明串連過程。編譯環境:Visual Studio 2010 旗艦版注意點:1、如果發現執行後結果中有顯示亂碼現象,請將工程屬性中的字元集項設定為:使用多位元組字元集或未設定。2、注意程式中的連接字串是適合我電腦資料庫的,你要是測試的需修改為你自己(可以按照上面的方法來獲得連接字串)
//匯入一個ADO動態連結程式庫msado15.dll#import "C:\Program Files\Common Files\System\ADO\\msado15.dll"#include <stdio.h>inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};void ConnectionStringX(_ConnectionPtr pConnection);//串連資料庫_bstr_t GetState(int intState);//得到串連狀態void PrintProviderError(_ConnectionPtr pConnection); //輸出錯誤void PrintComError(_com_error &e);//輸出錯誤void ExitConnect(_ConnectionPtr pConnection);//關閉串連void main(){// 初始化OLE/COM庫環境 if(FAILED(::CoInitialize(NULL))){ return;}//建立連線物件 _ConnectionPtr pConnection = NULL; ConnectionStringX(pConnection);ExitConnect(pConnection);// 釋放環境 ::CoUninitialize();}void ConnectionStringX(_ConnectionPtr pConnection){ HRESULT hr = S_OK; try { //ADO方式串連資料庫 TESTHR(pConnection.CreateInstance( __uuidof(Connection))); pConnection->ConnectionString = "Provider='SQLOLEDB';Data Source='SD-20120421UVIT\\SQLEXPRESS';""Initial Catalog='master';Integrated Security='SSPI';"; pConnection->ConnectionTimeout = 10; pConnection->Open("","","",adConnectUnspecified); printf("Connection1 state: %s\n",(LPCSTR)GetState(pConnection->State)); } catch(_com_error &e) { //列印錯誤 PrintProviderError(pConnection);PrintComError(e); }}//得到串連狀態_bstr_t GetState(int intState) { _bstr_t strState; switch(intState) { case adStateClosed: strState = "adStateClosed"; break; case adStateOpen: strState = "adStateOpen"; break; default: ; } return strState;}//列印串連過程中的錯誤訊息void PrintProviderError(_ConnectionPtr pConnection){ // 列印連線物件的發生的錯誤 ErrorPtr pErr = NULL; if( (pConnection->Errors->Count) > 0) { long nCount = pConnection->Errors->Count; for(long i = 0; i < nCount; i++) { pErr = pConnection->Errors->GetItem(i); printf("Error number: %x\t%s\n", pErr->Number,(LPCSTR)pErr->Description); } }}//列印COM錯誤void PrintComError(_com_error &e){ _bstr_t bstrSource(e.Source()); _bstr_t bstrDescription(e.Description()); printf("Error\n"); printf("\tCode = %08lx\n", e.Error()); printf("\tCode meaning = %s\n", e.ErrorMessage()); printf("\tSource = %s\n", (LPCSTR) bstrSource); printf("\tDescription = %s\n", (LPCSTR)bstrDescription);}//關閉串連void ExitConnect(_ConnectionPtr pConnection){ if (pConnection) if (pConnection->State == adStateOpen) pConnection->Close();}
結果如: