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