摘 要: 本文簡要介紹了微軟的活動資料對象(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具有比較廣闊的發展前景。 |