ADO接口之_ConnectionPtr

ADO中最重要的對象有三個:Connection、Recordset和Command,分別表示連接對象、記錄集對象和命令對象。

三個對象對應的智能指針分別是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。

ADO使用_ConnectionPtr這個指針來操縱Connection對象,類似地,後面用到的_CommandPtr和_RecordsetPtr分別表示命令對象指針和記錄集對象指針。

Connection對象是這三個對象的基礎,它的主要作用是建立與數據庫的連接,建立了與數據庫的連接後,才能進行其它有關數據庫的訪問和操作。也就是說,使用ADO操作數據庫,通常先用Connection對象的Open方法打開一個庫連接,然後才能進行數據庫的操作。操作完成後,要關閉這個庫連接。

本文只講述Connection對象最常用的Open方法和Execute方法。

注意:在使用ADO進行操作之前,必須使用AfxOleInit()函數來進行初始化;

1. Open()方法

用於打開一個庫連接,而Execute()方法一般用於執行一條SQL語句。

_ConnectionPtr智能指針的用法:

首先定義一個Connection類型的指針,然後調用CreateInstance()來創建一個連接對象的實例,再調用Open()函數建立與數據源的連接。

在建立連接對象後,可以使用連接對象的Execute()函數來執行SQL命令。

_ConnectionPtr智能指針Open()方法的原型:

Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)

ConnectionString爲連接字串,UserID是用戶名,Password是登陸密碼

Options是連接選項,可以是如下幾個常量:

    1> adModeUnknown 缺省,當前的許可權未設置

     2> adModeRead 只讀

     3> adModeWrite 只寫

     4> adModeReadWrite 可以讀寫

     5> adModeShareDenyRead 阻止其它Connection對象以讀權限打開連接

     6> adModeShareDenyWrite 阻止其它Connection對象以寫權限打開連接

     7> adModeShareExclusive 阻止其它Connection對象打開連接

     8> adModeShareDenyNone 阻止其它程序或對象以任何權限建立連接

2. Execute方法

函數原型:

_RecordsetPtr Connection::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)

參數:

CommandText是命令字串,通常是SQL命令,

RecordsAffected是操作完成後所影響的行數

Options表示CommandText中內容的類型,可以取下列值之一:

    1> adCmdText 表明CommandText是文本命令

    2>adCmdTable 表明CommandText是一個表名

    3>adCmdProc 表明CommandText是一個存儲過程

    4>adCmdUnknown 未知

Execute執行完後返回一個指向記錄集的指針(_ResultsetPtr類型)

3. 異常捕獲

出現的異常爲:_com_error

例程CREATE_DB_AND_TABLE中已經使用了_ConnectionPtr指針的Open方法和Execute方法,在後面的例程我們將進一步詳細說明。

例程

ConnPtr_Open_Exe

打開VC++ 6.0,新建一個基於對話框的工程ConnPtr_Open_Exe。在對話框IDD_CONNPTR_OPEN_EXE_DIALOG中進行編輯:

使用三個Group Box分成三個部分,第一部分演示使用Execute()函數來執行INSERT INTO命令;第二部分演示使用Execute()函數來執行Update命令;第三部分演示使用Execute()函數來執行SELECT命令。其中,第一部分和第二部分不需要返回記錄集,第三部分演示返回記錄集顯示結果。

該對話框幾個控件如下:

控件名稱    ID                                            用途

按鈕           IDC_BTN_INSERT_INTO  執行INSERT INTO語句

按鈕           IDC_BTN_UPDATE             執行Update語句

按鈕           IDC_BTN_SELECT            執行SELECT語句

列表框       IDC_LIST1                           顯示SELECT語句執行結果

使用ClassWizard給列表框IDC_LIST1創建CListBox變量m_list1:

雙擊IDC_BTN_INSERT_INTO按鈕,並編輯OnBtnInsertInto()函數如下:

[cpp] view plain copy
  1. void CConnPtr_Open_ExeDlg::OnBtnInsertInto()   
  2. {  
  3.     _ConnectionPtr m_pConnection;  
  4.     _variant_t RecordsAffected;  
  5.     try  
  6.     {  
  7.         m_pConnection.CreateInstance(__uuidof(Connection));  
  8.         m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  
  9.     }  
  10.     catch(_com_error e)  
  11.     {  
  12.         CString errormessage;  
  13.         errormessage.Format("連接數據庫失敗!\r錯誤信息:%s",e.ErrorMessage());  
  14.         AfxMessageBox(errormessage);  
  15.         return;  
  16.     }  
  17.   
  18.     try  
  19.     {  
  20.         _bstr_t strCmd="INSERT INTO Employees(EmployeeID,FirstName,LastName,HireDate,City,Country) VALUES(10,'Mary','Williams','15/4/1993 12:00:00','New York','USA')";  
  21.         m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
  22.     }  
  23.     catch(_com_error &e)  
  24.     {  
  25.         AfxMessageBox(e.Description());  
  26.     }  
  27.     if(m_pConnection->State)  
  28.     {  
  29.         m_pConnection->Close();  
  30.     }  
  31. }  

雙擊IDC_BTN_UPDATE按鈕,並編輯OnBtnUpdate()函數如下:

[cpp] view plain copy
  1. void CConnPtr_Open_ExeDlg::OnBtnUpdate()   
  2. {  
  3.     _ConnectionPtr m_pConnection;  
  4.     _variant_t RecordsAffected;  
  5.     try  
  6.     {  
  7.         m_pConnection.CreateInstance(__uuidof(Connection));  
  8.         m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  
  9.     }  
  10.     catch(_com_error e)  
  11.     {  
  12.         CString errormessage;  
  13.         errormessage.Format("連接數據庫失敗!\r錯誤信息:%s",e.ErrorMessage());  
  14.         AfxMessageBox(errormessage);  
  15.         return;  
  16.     }  
  17.   
  18.     try  
  19.     {  
  20.         _bstr_t strCmd="UPDATE Employees SET FirstName='Bill',LastName='Clinton',HireDate='25/11/1994 12:00:00',City='Los Angeles' WHERE EmployeeID=10";  
  21.         m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
  22.     }  
  23.     catch(_com_error &e)  
  24.     {  
  25.         AfxMessageBox(e.Description());  
  26.     }  
  27.   
  28.     if(m_pConnection->State)  
  29.     {  
  30.         m_pConnection->Close();   
  31.     }  
  32. }  

雙擊IDC_BTN_SELECT按鈕,並編輯OnBtnSelect()函數如下:

[cpp] view plain copy
  1. void CConnPtr_Open_ExeDlg::OnBtnSelect()   
  2. {  
  3.     _ConnectionPtr m_pConnection;  
  4.     _variant_t RecordsAffected;  
  5.     _RecordsetPtr m_pRecordset;  
  6.     try  
  7.     {  
  8.         m_pConnection.CreateInstance(__uuidof(Connection));  
  9.         m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  
  10.     }  
  11.     catch(_com_error e)  
  12.     {  
  13.         CString errormessage;  
  14.         errormessage.Format("連接數據庫失敗!\r錯誤信息:%s",e.ErrorMessage());  
  15.         AfxMessageBox(errormessage);  
  16.         return;  
  17.     }  
  18.     try  
  19.     {  
  20.         m_pRecordset.CreateInstance("ADODB.Recordset"); //爲Recordset對象創建實例  
  21.         _bstr_t strCmd="SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'";  
  22.         m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
  23.     }  
  24.     catch(_com_error &e)  
  25.     {  
  26.         AfxMessageBox(e.Description());  
  27.     }  
  28.     _variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;  
  29.     try  
  30.     {  
  31.         while(!m_pRecordset->adoEOF)  
  32.         {  
  33.             vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));  
  34.             //取得第1列的值,從0開始計數,你也可以直接列出列的名稱,如下一行  
  35.             vFirstName=m_pRecordset->GetCollect("FirstName");  
  36.             vLastName=m_pRecordset->GetCollect("LastName");  
  37.             vHireDate=m_pRecordset->GetCollect("HireDate");  
  38.             vCity=m_pRecordset->GetCollect("City");  
  39.             CString strtemp;  
  40.             if(vEmployeeID.vt!=VT_NULL)  
  41.             {  
  42.                 strtemp.Format("%d",vEmployeeID.lVal);  
  43.             }  
  44.             if(vFirstName.vt!=VT_NULL)  
  45.             {  
  46.                 strtemp+=" ";  
  47.                 strtemp+=(LPCTSTR)(_bstr_t)vFirstName;  
  48.             }  
  49.             if(vLastName.vt!=VT_NULL)  
  50.             {  
  51.                 strtemp+=" ";  
  52.                 strtemp+=(LPCTSTR)(_bstr_t)vLastName;  
  53.             }  
  54.             if(vHireDate.vt!=VT_NULL)  
  55.             {  
  56.                 strtemp+=" ";  
  57.                 strtemp+=(LPCTSTR)(_bstr_t)vHireDate;  
  58.             }  
  59.             if(vCity.vt!=VT_NULL)  
  60.             {  
  61.                 strtemp+=" ";  
  62.                 strtemp+=(LPCTSTR)(_bstr_t)vCity;  
  63.             }  
  64.   
  65.             m_list1.AddString(strtemp);  
  66.             m_list1.AddString("\n");  
  67.   
  68.             //移動到下一條記錄  
  69.             m_pRecordset->MoveNext();  
  70.         }  
  71.     }  
  72.     catch(_com_error &e)  
  73.     {  
  74.         AfxMessageBox(e.Description());  
  75.     }  
  76.   
  77.     m_pRecordset->Close();  
  78.     m_pRecordset=NULL;  
  79.     m_pConnection->Close();   
  80.     m_pConnection=NULL;  
  81. }  

附加操作(重要):

1> 在stdafx.h中加入如下語句:

#import "C:\Program Files\Common Files\system\ado\msado15.dll" rename("EOF","adoEOF")

2> 在BOOL CConnPtr_Open_ExeApp::InitInstance()函數中加入:

AfxOleInit();

該部分演示瞭如何使用_ConnectionPtr接口開發ACCESS數據庫:先創建一個Connection對象實例,然後用Open方法打開一個庫連接,最後使用Execute方法執行SQL語句進行其它有關數據庫的訪問和操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章