简析Visual C++中的活动数据对象
生活随笔
收集整理的這篇文章主要介紹了
简析Visual C++中的活动数据对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
| 簡析Visual C++中的活動數據對象 |
| 程序運行效果截圖: |
摘 要: 本文簡要介紹了微軟的活動數據對象(ADO)模型,結合實例闡述了在Visual C++環境下使用ADO操縱數據庫的基本步驟,分析ADO的特點及與開放式數據庫連接(ODBC)的差異與應用前景。 左圖:ADO對象模型 關鍵詞: 活動數據對象 數據庫 Visual C++ 1 ADO是微軟整個COM戰略體系中的一個組成部分 活動數據對象(ADO)是一組由微軟提供的COM組件。 ADO建立在微軟所提倡的COM體系結構之上,它的所有接口都是自動化接口,因此在C++、VisualBasic、Delphi等支持COM的開發語言中通過接口都可以訪問到ADO。ADO通過使用OLE DB這一新技術實現了以相同方式可以訪問關系數據庫、文本文件、非關系數據庫、索引服務器和活躍目錄服務等的數據,擴大了應用程序中可使用的數據源范圍,從而成為微軟整個COM戰略體系中訪問數據源組件的首選,是ODBC的替代產品。 2 ADO對象模型組成 與微軟的其它數據訪問模型DAO和RDO相比,ADO對象模型非常精煉,僅由三個主要對象Connection、Command、Recordset和幾個輔助對象組成,其相互關系如圖所示。Connection對象提供OLE DB數據源和對話對象之間的關聯,它通過用戶名稱和口令來處理用戶身份的鑒別,并提供事務處理的支持;它還提供執行方法,從而簡化數據源的連接和數據檢索的進程。Command對象封裝了數據源可以解釋的命令,該命令可以是SQL命令、存儲過程或底層數據源可以理解的任何內容。Record set用于表示從數據源中返回的表格數據,它封裝了記錄集合的導航、記錄更新、記錄刪除和新記錄的添加等方法,還提供了批量更新記錄的能力。其它輔助對象則分別提供封裝ADO錯誤、封裝命令參數和封裝記錄集合的列。 3 ADO的特點分析 (1)由于封裝了許多底層工作,使用ADO與使用ODBC幾乎是一樣方便。 (2) ADO不僅具有ODBC的主要功能,而且ADO適用的數據源的范圍要大的多。 (3)在定義ADO記錄集變量和數據庫表字段綁定類時,要求記錄集的字段變量、狀態變量與數據庫表字段的個數、順序必須相同。這一點比在FMC中使用ODBC要復雜一些。但在數據庫字段與ADO記錄集字段變量綁定的宏中,ADO 提供的數據類型要遠多于FMC中的RFX(如日期時間類型,在ODBC中只能轉換為Cstring類型)。 (4)ADO允許同一Connection實例下有多個Record set實例。 (5)ADO允許進行批更新(使用的Update Batch方法),這樣將大大減輕網絡負擔,提高數據庫處理效率。 4 ADO在Visual C++中的使用 利用微軟在Micrsoft Studio 6中提供的ADO2,可以在Visual C++中使用ADO接口操縱SQL SERVER數據庫。在編譯型高級語言中使用ADO,比起在一些腳本語言(如Visual Basic Scropt和JavaScript)中使用ADO要困難一些。 以下給出一個Visual C++下使用ADO的Connection對象及其Record set對象的基本步驟: (1) 使用import指令引入ADO2組件 例:#import "C:ADOmsado15.dll" no_namespace rename("EOF", "EndOfFile") (2) 定義CADORecordBinding 的派生類,用于程序與數據庫表字段的交互,該類的定義可參見icrsint.h。 例: class CIntlive : public CADORecordBinding { public: DBTIMESTAMP m_datetime; //定義ADO記錄集字段變量(與數據庫表字段相對應) long m_key; long m_value; long m_quality; WORD m_stsdatetime; //定義ADO記錄集狀態變量 WORD m_stskey; WORD m_stsvalue; WORD m_stsquality; BEGIN_ADO_BINDING(CIntlive) //將數據庫字段與ADO記錄集字段變量綁定 ADO_VARIABLE_LENGTH_ENTRY2(1,adDBTimeStamp,m_datetime,sizeof(m_datetime),m_stsdatetime,true) ADO_NUMERIC_ENTRY(2,adInteger,m_key,10,0,m_stskey,true) ADO_NUMERIC_ENTRY(3,adInteger,m_value,10,0,m_stsvalue,true) ADO_NUMERIC_ENTRY(4,adInteger,m_quality,10,0,m_stsquality,true) END_ADO_BINDING() }; (3) 調用CoInitialize初始化COM ::CoInitialize(NULL); (4) 聲明ADO的Connection對象指針和Recordset對象指針并初始化。(類型名在 msado15.dll中已定義) 例: _ConnectionPtr pConnection1 = NULL; _RecordsetPtr rstADO1 = NULL; (5) 定義CADORecordBinding派生類的實例及其Bind接口指針。 例: CIntlive m_intdata; IADORecordBinding *rstADOBind1 = NULL; (6) 產生Connection對象實例和Record set對象實例。 例: pConnection1.CreateInstance(_uuidof(Connection)); rstADO1.CreateInstance(__uuidof(Recordset)) ; (7) 連接到數據庫并打開Record set對象,其中open函數的參數的使用方法可參見微軟MSDN中ADO 相應對象參數的Basic描述。 例: PConnection1->Open("driver={SQL server};server=servera;uid=sa;pwd=;database=pubs","","",NULL); rstADO1->Open("data", _variant_t((IDispatch *)pConnection1,true), adOpenKeyset,adLockBatchOptimistic, adCmdTable); (8) 將CADORecordBinding派生類的實例聯編到Record set對象的Bind接口。 例: RstADOBind1->BindToRecordset(&m_intdata); (9) 對Record set對象實例進行操作。操作方法可參見微軟MSDN中ADO Record set對象相應方法的Basic描述。 例: rstADO1->Move Next(); //移動游標到下一條記錄 rstADO1->Update(_variant_t("quality"),_variant_t("3"))); //修改記錄的quality字段的值為3 rstADO1->Update Batch(adAffectAll)); //將在Record set對象上的所有更新一次送入數據庫 (10) 關閉Record set對象并釋放Bind接口。 例: RstADO1->Close(); RstADOBind2->Release(); (11) 關閉連接 pConnection1->Close(); (12) 調用CoUnitialize釋放COM資源 ::CoUninitialize(); 5 結論 作為ODBC的替代產品,ADO確實有其過人之處。由于ADO數據源幾乎覆蓋了目前常見的數據源類型,對于ODBC所不支持的數據源,ADO無疑是唯一的選擇。而ADO的批更新功能,更是網絡環境下大數據量更新應用的重要因素。由于ADO缺乏大量的第三方廠商的支持,使得ADO目前遠不如ODBC普及,但其面向對象的特性將使ADO具有比較廣闊的發展前景。 |
總結
以上是生活随笔為你收集整理的简析Visual C++中的活动数据对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xp 无线连接 服务器,NPS配置无线策
- 下一篇: 读他:男人最怕听的十句话