[ADO&VC一]使用ADO智能指針_ConnectionPtr,_CommandPtr及_R...

使用C++(MFC)操做數據庫,首選就是ADO。ADO庫包含三個基本接口:_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。在MFC要使用ADO(COM)首先要引用COM地址,編譯器纔可以實現。從網上的不少資料都介紹,將EOF重命名,防止和其餘衝突,那偶們也這樣作反正也不會有壞處。格式以下:
#include <comdef.h>
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF", "EndOfFields")
    只要用過MFC的人都知道把它放在哪(stdafx.h)。因爲ADO是一個COM因此在調用他們以前要初始化COM環境,本人就在初始化這個栽了個跟頭。初始化OLE(調用AfxOleInit();)在方法uApp::InitInstance()中進行(必須在DoModal()以前),固然也能夠在你調用前初始化。OK下面就能夠調用了,系統會生成兩個文件,這些都是從COM高過來的。

    _ConnectionPtr接口返回一個記錄集或一個空指針。一般使用它來建立一個數據鏈接或執行一條不返回任何結果的SQL語句,如一個存儲過程。使用 _ConnectionPtr接口返回一個記錄集不是一個好的使用方法。對於要返回記錄的操做一般用_RecordserPtr來實現。而用 _ConnectionPtr操做時要想獲得記錄條數得遍歷全部記錄,而用_RecordserPtr時不須要。
    _CommandPtr接口返回一個記錄集。它提供了一種簡單的方法來執行返回記錄集的存儲過程和SQL語句。在使用_CommandPtr接口時,你能夠利用全局 _ConnectionPtr接口,也能夠在_CommandPtr接口裏直接使用鏈接串。若是你只執行一次或幾回數據訪問操做,後者是比較好的選擇。但若是你要頻繁訪問數據庫,並要返回不少記錄集,那麼,你應該使用全局_ConnectionPtr接口建立一個數據鏈接,而後使用_CommandPtr 接口執行存儲過程和SQL語句。
    _RecordsetPtr是一個記錄集對象。與以上兩種對象相比,它對記錄集提供了更多的控制功能,如記錄鎖定,遊標控制等。同_CommandPtr接口同樣,它不必定要使用一個已經建立的數據鏈接,能夠用一個鏈接串代替鏈接指針賦給 _RecordsetPtr的connection成員變量,讓它本身建立數據鏈接。若是你要使用多個記錄集,最好的方法是同Command對象同樣使用已經建立了數據鏈接的全局_ConnectionPtr接口,而後使用_RecordsetPtr執行存儲過程和SQL語句。

    使用_ConnectionPtr和_RecordsetPtr來讀取數據庫內容:
 1       try {
 2           //  TODO: 在此添加額外的初始化代碼
 3          CString szServerName  =  _T( " Driver=SQL Server;Server=(local);Database=Domains;uid=sa;pwd=; " );
 4          HRESULT hr  =  m_pConnection.CreateInstance(__uuidof(Connection));
 5          hr  =  m_pConnection -> Open((_bstr_t)szServerName, "" , "" , 0 );
 6          hr  =  m_pRecordset.CreateInstance(__uuidof(Recordset));
 7          CString szSQL = _T( " SELECT DomainName FROM Domains; " );
 8          BSTR bstrSQL  =  szSQL.AllocSysString();
 9          hr  =  m_pRecordset -> Open(bstrSQL,(IDispatch  * )m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText);
10           while ( ! m_pRecordset -> EndOfFields)
11          {
12              _variant_t theValue;
13              theValue  =  m_pRecordset -> GetCollect( " DomainName " );
14              
15               if (theValue.vt != VT_NULL)
16              {
17                  AfxMessageBox(CString(theValue));
18              }
19              m_pRecordset -> MoveNext();
20          }
21          m_pRecordset -> Close();
22          m_pConnection -> Close();
23      }
24       catch (_com_error  * e) 
25      { 
26          MessageBox(e -> Description(),e -> Source()); 
27      }
    OK,運行就能夠獲得數據了,這就做爲ADO(C++)編程入門的介紹,在實踐中慢慢體會,在失敗中前進。偶是個C++初學者,若是有不對的地方還請賜教。
相關文章
相關標籤/搜索