VS2010通過ADO連結SQL Server的方法體會
分步詳解——關鍵點、詳細操作步驟
關鍵點:
1.連結引數的設定。(因為不同書籍,不同大牛們給的連結引數都各式各樣,造成新手們很困擾--本人也是被困擾了一天一夜啊!)。
(1)連結引數
版本一:
方式一:(直接連結SQL server方式)
_bstr_t strConnect="Provider=SQLOLEDB;Data Source=LENOVO-PC\\SQLEXPRESS;Persist Security Info=True;User ID=Mysa;Pwd=malingyi123654;Initial Catalog=Emploees";
方式二:(通過ODBC的引數傳遞)--個人不是很熟悉這種,因此只對上面的方式舉例說明,想要這種方式的可以求大神
m_pConnection->ConnectionString="DSN=RocketsPayers;DBQ=E:\\gucas\\vs2010projects\\Rockets\\RocketsPlayers.mdb;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5";
版本二:
Connection物件有幾個屬性,Open()函式的作用應該就是為那些連結資料庫需要的屬性賦值,屬性如下//眾多屬性之中大部分都可以在ConnectionString中宣告,下面的例子就是如此。有一些不用宣告,有預設引數:State、CommandTimeout、DefaultDatabase等 等,鏈 接引數當中提供基本的資料資訊就可以了。
CommandTimeout // 指示在種植嘗試和產生錯誤之前執行命令期間需要等待的時間
ConnectionString // 該屬性包含用來建立到資料來源的連結資訊,通過傳遞包含一系列由分隔的Argument=value語句的詳細連結字串可指定資料來源
ConnectionTimeout // 指示在種植嘗試和產生錯誤之前建立連結期間需要等待的時間
DefaultDatabase // 屬性可設定或返回指定Connection物件上預設資料庫的名稱。指示Connectiong物件的預設資料庫
Mode // 可設定或返回當前連線上提供者正在使用的訪問許可權。只能在關閉Connection物件時方可設定
Provider // 可設定或返回連結提供者的名稱
State // 可以隨時使用State屬性確定hiding物件的當前狀態。該屬性為只讀
Version // 表示ADO的版本號
//連結引數設定
m_pConnection->ConnectionTimeout=2;///設定超時時間為2秒
//連線SQL資料庫
m_pConnection->Open("driver={SQL Server};Server=LENOVO-PC\\SQLEXPRESS;DATABASE=Emploees;UID=Mysa;PWD=malingyi123654","","",adModeUnknown);
//Open裡引數設定我說下:
driver={SQL Server};//連線SQL Server 2000資料庫
Server=LENOVO-PC\\SQLEXPRESS;//伺服器名字,也就是本機上的,開啟sql server服務管理器裡伺服器(v)的名字
DATABASE=Emploees;//SQL server伺服器裡一個自己的資料庫的名字.
UID=Mysa; //資料庫使用者名稱
PWD=malingyi123654; //使用者名稱所對應的資料庫密碼
ConnectionTimeout=2; //此為伺服器超時時間,Connection 物件的 ConnectionTimeout 屬性, 預設值是15,
//意思是當伺服器連結超時後15秒顯示錯誤提示、或者超時提示
adModeUnknown ;//此為連結模式,還有其它引數,需要具體瞭解的可以到其它部落格或者書籍查詢
(2)open()函式
open()函式是用來啟動資料庫連結的。它有多重過載方式。每種過載方式的引數大致相同,有些是解決當用戶在連結引數裡面輸入的引數順尋或者型別多樣化的
問題。
// 函式原型如下:
HRESULT Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options);
ConnectionString://表示連結引數,如果在Connection 實列中已經將其初始化了那麼再Open()函式中就不用作為引數傳遞了,因為已經完成 //引數的傳遞了。
UserID ://表示資料庫使用者ID,如果在Connection的連結引數strConnect 中已經含有了,那麼也不用傳遞了直接用 “” (空字串) //代替
Password : //表示資料庫使用者密碼,同上,如果在連結引數中已經說明,那麼也只用 "" (空字串)代替
Options : //說明開啟資料庫的方式,此引數為列舉型,決定Open()函式是同步執行還是非同步執行
//其實 Open()函式只是一個介面而已,真正負責開啟連結的是另外一個被保護的成員函式 :raw_Open()
virtual HRESULT __stdcall raw_Open (
/*[in]*/ BSTR ConnectionString,
/*[in]*/ BSTR UserID,
/*[in]*/ BSTR Password,
/*[in]*/ long Options ) = 0;
Open()函式體中呼叫raw_Open()完成連結,因此從raw_Open()的引數列表中我們也可以看到,連結時不需要提供全部的Connection屬性。:
inline HRESULT Connection15::Open ( _bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options ) {
HRESULT _hr = raw_Open(ConnectionString, UserID, Password, Options);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _hr;
}
它的引數跟Open的一樣。
下面我就給大家放幾段連結的程式碼上去,希望能夠幫助大家。
步驟一:ADO物件的匯入
在使用ADO技術的時候,需要匯入一個ADO動態連結庫 msado**.dll(不同作業系統不一樣,我的作業系統是msado15.dll,後面就用它來講解),該動態庫位於系統盤下的“Program Files\Common Files\System\ado\msado15.dll”。例如,系統盤為C盤,則該檔案位於"C:\Program Files\Common Files\System\ado\msado15.dll"。
//在VC++中,需要使用預處理命令#import 將動態連結庫匯入到到工程的 —"StdAdx.h" 標頭檔案中,這樣才能使用ADO連結物件,完成連結。
#import "C:\Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","AdoEOF") rename("BOF","AdoBOF")
//將上面這段程式碼插入到"StdAdx.h" 標頭檔案中, 後面的no_namespace 是為了省去名稱空間,rename 是為了避免與原有的EOF、BOF標誌衝突,改成什麼可以自 //定。
步驟二:初始化COM環境
由於ADO庫是一個COM動態庫,所以在應用程式呼叫ADO之前,必須初始化COM環境。通常在MFC裡面用CoInitialize函式初始化。
<pre class="cpp" name="code"> //注意,一定要在你連結資料庫之前初始化,不然會連結失敗。
//一般在程式類的InitInstance函式中初始化COM環境
::CoInitialize(NULL); //初始化COM環境
//程式最後還要釋放COM環境,具體的地方不定,但是至少在你已經不會用到資料庫的地方
//一般在程式的ExitInstance()中
::CoUninitialize(); //釋放COM環境
步驟三:ADO只能指標的建立---為了方便建立和刪除ADO物件,也可以不用,直接實列話一個物件
//首先在你第一次使用資料庫連結的類的標頭檔案中宣告指標,並在建構函式當中初始化為null
_ConnectionPtr m_pConnection;
</pre><pre class="cpp" name="code"> //然後,在Oninitial***()(某個窗體,或者是直接定義的一個ADO類最好)中建立物件例項
m_pConnection.CreareInstance("ADODB.Connection"); //第一種方法
m_pConnection.CreateInstance(__uuidof(Connection)); //第二種方法
步驟四:連結資料庫
使用ADO連結資料庫是通過COnnection物件的Open方法實現的。
m_pConnection.Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long options);
//連結引數的設定上面已經講到,此處不再說明
//函式原型如下:
HRESULT Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options);
ConnectionString://表示連結引數,如果在Connection 實列中已經將其初始化了那麼再Open()函式中就不用作為引數傳遞了,因為已經完成 //引數的傳遞了。
UserID ://表示資料庫使用者ID,如果在Connection的連結引數strConnect 中已經含有了,那麼也不用傳遞了直接用 “” (空字) //代替
Password ://表示資料庫使用者密碼,同上,如果在連結引數中已經說明,那麼也只用 "" (空字串)代替
Options ://說明開啟資料庫的方式
實際操作程式碼:為ADO連結專門建立一個方法:OnInitADOConn()
void C資料庫試煉Dlg::OnInitADOConn(void)
{
HRESULT hr = NULL;
try {
hr = m_pConnection.CreateInstance("ADODB.Connection");///建立 Connection 物件
if(SUCCEEDED(hr)){
//登入資料庫並連線資料庫DBCourse
//這裡的server不能寫成127.0.0.1否則會出現未指定的錯誤,應該寫成Sql server登入介面的伺服器名稱,而且要有兩個反斜槓 \\
m_pConnection->ConnectionString = "driver={SQL Server};server=LENOVO-PC\\SQLEXPRESS;uid=Mysa;pwd=malingyi123654;";
m_pConnection->Open("","","",adConnectUnspecified);//已經對ConnectionString複製了,因此Open函式就不需要傳遞連結引數了
//上面的strConnect中有了User ID,那麼這裡就要預設,不然就會
//報錯;同理,可以在上面也把密碼寫了,下面就不要寫密碼了
m_pConnection->DefaultDatabase = (_bstr_t)_T("Emploees"); //這段程式碼可以直接在ConnectionString中新增(Initial Catalog= //Emploees) Initial Catalog是說資料庫的名稱
// _bstr_t strConnect="Provider=SQLOLEDB;Data Source=LENOVO-PC\\SQLEXPRESS;Persist Security Info=True;User ID=Mysa //;Pwd=malingyi123654;Initial Catalog=Emploees";
}
else{
AfxMessageBox(TEXT("建立 Connection 物件失敗"));///顯示錯誤資訊
return ;
}
}
catch(_com_error e){///捕捉異常
CString errormessage;
errormessage.Format( TEXT("連線資料庫失敗 !\r\n 錯誤資訊 :%s(%ld)"),e.ErrorMessage(),e.Error() );
AfxMessageBox(errormessage);///顯示錯誤資訊
return ;
}
return ;
}
2.異常捕獲
大家要善於利用異常捕獲機制,因為連結的時候很容易出現位置錯誤,所以要將連結的地方Try起來,這樣才能幫助你更快的發現錯誤。
上面就是我自己的一些體會,這個東西折磨我太久了,不像Java的JDBC很容易就搞定了。能力有限,心有餘而力不足,思路可能有點亂,不過還是希望能夠幫助到大家,同時更希望大神來指點!