VC++ ADO開發實踐之七 (轉)

gugu99發表於2007-08-17
VC++ ADO開發實踐之七 (轉)[@more@]一致的資料訪問技術ADO/OLE

  新近推出的UDA(Universal Data Access,一致資料訪
問技術)為關係型或非關係型資料訪問提供了一致的訪問介面,為企業
級Intr應用多層結構提供了資料介面標準。一致資料訪問包
括兩層軟體介面,分別為ADO(Active Data )和OLED B,對應於
不同層次的應用開發,ADO提供了高層軟體介面,可在各種指令碼語言(Sc
ript)或一些宏語言中直接使用;OLE DB提供了底層軟體介面,可在C/C
++語言中直接使用。ADO以OL E DB為基礎,它對OLE DB進行了封裝。
一致資料訪問技術建立在Microsoft的COM(模型)基礎上,它
包括一組COM元件,元件與元件之間或者元件與客戶程式之間透過
標準的COM介面進行通訊。
  由於ADO建立在自動化(Automation)基礎上,所以ADO的應用場合
非常廣泛,不僅可在這樣的高階語言開發環境中使用,還
可以在一些指令碼語言中使用,這對於開發應用,在(Active Serv
er Page)的指令碼程式碼訪問中提供了操作應用的捷徑。本文將首
先介紹ADO和OLE DB的結構模型,以便讀者瞭解ADO與OLE DB之間的關
系,然後介紹ADO的物件模型和ADO的一些特性,同時我們也將透過一些
例子程式碼向讀者展示ADO的用法。
  一、一致資料訪問介紹
  隨著技術和資料庫技術的不斷髮展,現在的應用對資料
整合的要求越來越高,這些資料有可能分佈在不同的地方,並且使用不
同的格式,例如關係型資料庫和中的、電子表格、電子
、多資料以及目錄服務資訊等等。傳統的解決方案是使用大
型的資料庫系統,把所有這些資料都移到資料庫系統中,然後按照操作
資料庫的辦法對這些資料進行訪問,這樣做雖然能夠按統一的方式對
資料進行各種操作,但這種間接訪問方式帶來了很多問題,比如資料更
新不及時、空間資源的冗餘和訪問低等等。
  Microsoft公司推出的一致資料訪問技術則較好地解決了這些問
題,它使得應用透過一致的介面來訪問各種各樣的資料,而不管資料駐
留在何處,也不需要進行資料轉移或複製、轉換,在實現分散式的同時
也帶來了高效率。並且UDA技術在統一資料訪問介面的同時,它的多層
結構使資料使用方有了更多的選擇機會,而它強大的擴充套件能力也給數
據提供方留下了更多的擴充套件餘地,這種開放型的軟體結構使它具有極
強的生命力,所以,這種技術從一推出便獲得了廣泛的歡迎,可以說,UD
A技術是繼ODBC之後的又一資料訪問技術的飛躍。
  UDA技術包括OLE DB和ADO兩層標準介面,OLE DB是系統級的
介面,它定義了一組COM介面,這組介面封裝了各種資料系統的訪問操
作,這組介面為資料使用方和資料提供方建立了標準,OLE DB還提供了
一組標準的服務元件,用於提供查詢、快取、資料、事務處理等
操作,因此,資料提供方只需實現一些簡單的資料操作,在使用方就可
以獲得全部的資料控制能力。
  ADO是應用層的程式設計介面,它透過OLE DB提供的COM介面訪問資料,
它適合於各種客戶機/應用系統和基於Web的應用,尤其在一些
指令碼語言中訪問資料庫操作是ADO的主要優勢。ADO是一套用自動化技
術建立起來的物件層次結構,它比其他的一些物件模型如DAO(Data Ac
cess Object)、RDO(Remote Data Object)等具有更好的靈活性,使用
更為方便,並且訪問資料的效率更高。
  圖1顯示了統一資料訪問的軟體層次模型。
圖1 UDA的層次結構圖
  從圖中我們可以看出,應用程式既可以透過ADO訪問資料也可以直
接透過OLE DB訪問資料,而ADO則透過OLE DB訪問底層資料。而且,OLE
 DB分成兩部分,一部分由資料提供者實現,包括一些基本功能,如獲取
資料、修改資料、新增資料項等;另一部分由系統提供, 包括一些高
級服務,如遊標功能、分散式查詢等等。這樣的層次結構既為資料使
用者即應用程式提供了多種選擇方案,又為資料提供方簡化了服務功
能的實現手段,它只需按OLED B規範編寫一個COM元件程式即可,使得
第三方釋出資料更為簡便,而在應用程式方可以得到全面的功能服務,
這充分體現了OLE DB兩層結構的優勢。
  由於OLE DB和ADO都以COM元件的形式實現,所以COM元件的各種特
性也使得構建資料應用更為靈活,而不僅僅侷限於一般的客戶機/服務
器或Web應用模型,它既適合於以資料為中心的應用,也適合於多層結
構的分散式軟體系統。透過對COM元件的,我們可以建立各種複雜
的應用系統。利用從COM到DCOM的位置透明技術,我們可以很方便地建
立分散式應用系統;利用MTS(Microsoft Transaction Server)執行環
境,我們也可以在資料訪問一層增加性控制,並利用MTS的物件管
理使資料訪問效率更高。所有這些功能都無需資料提供方編寫程式碼實
現,只需在DCOM或MTS環境中進行常規的配置即可。
  可以說一致的資料訪問技術的核心是OLE DB,OLE DB建立了資料
訪問的標準介面,它把所有的資料來源經過抽象形成行集(rowset)的概
念。OLE DB模型主要包括以下一些COM物件:
  (1)資料來源(Data )物件 資料來源物件對應於一個資料提供
者,它負責管理、建立與資料來源的連線等初始操作。
  (2)會話(Session)物件 在資料來源連線的基礎上建立會話物件,會
話物件提供了事務控制機制。
  (3)命令(Command)物件 資料使用者利用命令物件各種資料
操作,如查詢命令、修改命令等。
  (4)行集(Rowset)物件 提供了資料的抽象表示,它可以是命令執
行的結果,也可以直接由會話物件產生,它是應用程式主要的操作物件

  OLE DB的物件模型非常簡單,這種簡單性也帶來了靈活性,從上面
的幾個COM物件也可以看出這一點。下面我們將從應用層角度出發,通
過建立在OLE DB基礎上的ADO物件模型結構的分析和使用以幫助讀者
進一步理解一致資料訪問技術。
  二、ADO物件模型
  ADO物件模型定義了一組可程式設計的自動化物件,可用於Visual Bas
ic、Visual C++、以及其他各種支援自動化特性的指令碼語言。AD
O最早被用於Microsoft Internet In formation Server中訪問資料
庫的介面,與一般的資料庫介面相比,ADO可更好地用於網路環境,透過
技術,它儘可能地降低網路流量;ADO的另一個特性是使用簡單,不
僅因為它是一個面向高階使用者的資料庫介面,更因為它使用了一組簡
化的介面用以處理各種資料來源。這兩個特性使得ADO必將取代RDO和DA
O,成為最終的應用層資料介面標準。
  從圖1我們也看到了ADO實際上是OLE DB的應用層介面,這種結構
也為一致的資料訪問介面提供了很好的擴充套件性,而不再侷限於特定的
資料來源,因此,ADO可以處理各種OLE DB支援的資料來源。
  圖2是ADO的物件模型圖。
圖2 ADO物件模型
  在ADO模型中,主體物件只有3個:Connection、Command和Records
et,其他4個集合物件Errors、Properties、Parameters和Fields分別
對應Error、Property、Parameter和Field物件,整個ADO物件模型由
這些物件組成。
  一個典型的ADO應用使用Connection物件建立與資料來源的連線,然
後用一個Command物件給出對資料庫操作的命令,比如查詢或者更新數
據等,而Recordset用於對結果集資料進行維護或者瀏覽等操作。Comm
and命令所使用的命令語言與底層所對應的OLE DB資料來源有關,不同的
資料來源可以使用不同的命令語言,對於關係型資料庫,通常使用作
為命令語言。
  在Connection、Command和Recordset 3個物件中,Command物件是
個可選物件,它是否有效取決於OLE DB資料提供者是否實現了IComman
d介面。由於OLE DB可提供關係型資料來源也可以提供非關係型資料來源,
所以在非關係型資料來源上使用傳統的SQL命令查詢資料有可能無效,甚
至Command命令物件也不能使用。
  從結構上看,ADO模型非常簡單,但使用上又非常靈活,下面我們先
從單個物件的角度進行討論:
  (1) Connection物件 Connection物件代表與資料來源之間的一個
連線,ADO的Connec tion物件封裝了OLE DB的資料來源物件和會話物件
。根據OLE DB提供者的不同,Conne ction物件的特性也有所不同
,所以Connection物件的方法和屬性不一定都可以使用。利用Connect
ion物件,我們可以完成以下一些基本設定操作。
  a.透過ConnectionString、ConnectionTimeOut和Mode屬性設定
連線串、超時資訊、訪問。
  b.還可以設定CursorLocation屬性以便指定使用客戶端遊標,以
便在客戶程式中使用批處理修改方式。
  c.設定連線的預設資料庫屬性DefaultDatabase。
  d.設定OLE DB提供者的屬性Provr。
  e.透過Open和Close控制Connection物件與物理資料來源的連線。
  f.透過Execute方法執行命令。
  g.提供事務機制,透過BeginTrans、CommitTrans和RollbackTran
s方法實現事務控制。
  h.透過Errors集合屬性檢查資料來源的錯誤資訊。
  i.透過OpenSchema方法獲取資料庫的表資訊。
  Connection物件是ADO的基本物件之一,它獨立於所有其他的物件
。如果我們要對資料庫進行查詢操作,既可以使用Execute方法,也可
以使用Command物件。使用Execute方法比較簡便,但用Command物件可
以儲存命令的資訊,以便多次查詢。
  (2) Command物件 Command物件代表一個命令,可以透過其方法執
行針對資料來源的有關操作,比如查詢、修改等。Command物件的用法如
下:
  a.透過CommandText屬性設定命令串。
  b.透過Parameters集合屬性和Parameter物件定義引數化查詢或
過程的引數。
  c.透過Execute方法執行命令,可能的話,返回Recordset物件。
  d.在執行命令之前,可透過設定CommandType屬性以便最佳化效能。
  e.可以透過Prepared屬性指示底層的提供者為當前命令準備一個
編譯過的版本,以後再執行時,速度會大大加快。
  f.透過CommandTimeOut屬性設定命令執行的超時值(以秒為單位)

  g.可以設定ActiveConnection屬性,為命令指定連線串,Command
物件將在內部建立C onnection物件。
  h.可以設定Name屬性,這樣以後可以在相應的Connection物件上
按Name屬性指定的方法名執行。
  Command物件執行時,既可以透過ActiveConnection屬性指定相連
的Connection物件,也可以獨立於Connection物件,直接指定連線串,
即使連線串與Connection物件的連線串相同,Command物件仍然使用其
內部的資料來源連線。
(3)Recordset物件 Recordset物件代表一個表的記錄集或者命令
執行的結果,在記錄集中,總是有一個當前的記錄。記錄集是ADO管理
資料的基本物件,所有的Recordset物件都按照行列方式的表狀結構進
行管理,每一行對應一個記錄(Record),每一列對應一個域(Field)。
Recordset物件也透過遊標對記錄進行訪問,在ADO中,遊標分為以下4種
:
  靜態遊標提供對資料集的一個靜態複製,允許各種移動操作,包括
前移、後移等等,但其他使用者所做的操作反映不出來。
  動態遊標允許各種移動操作,包括前移、後移等等,並且其他使用者
所做的操作也可以直接反映出來。
  前向遊標允許各種前向移動操作,不能向後移動,並且其他使用者所
做的操作也可以直接反映出來。
  鍵集(keyset)遊標 類似於動態遊標,也能夠看到其他使用者所做的
資料修改,但不能看到其他使用者新加的記錄,也不能訪問其他使用者刪除
的記錄。
  Recordset物件的用法如下:
  a.利用CursorType屬性設定遊標型別。
  b.透過Open方法開啟記錄集資料,既可以在Open之前對ActiveCon
nection屬性賦值, 指定Recordset物件使用連線物件,也可以直接在O
pen方法中指定連線串引數,ADO將建立一個內部連線,即使連線串與外
部的連線物件相同,它也使用新的連線物件。
  c.Recordset物件剛開啟時,當前記錄被定位在首條記錄,並且BOF
和EOF標誌屬性為F alse,如果當前記錄集為空記錄集,則BOF和EOF標
志屬性為True。
  d.透過MoveFirst、MoveLast、MoveNext和MovePrevious方法可
以對記錄集的遊標進行移動操作。如果OLE DB提供者支援相關功能的
話,可以使用AbsolutePosition、Absol utePage和Filter屬性對當前
記錄重新定位。
  e.ADO提供了兩種記錄修改方式:立即修改和批修改。在立即修改
方式下,一旦U pdate方法,則所有對資料的修改立即被寫到底層
的資料來源。在批修改方式下,可以對多條記錄進行修改,然後呼叫Upda
teBatch方法把所有的修改遞交到底層資料來源。遞交之後,可以用Stat
us屬性檢查資料衝突。
  Recordset物件是ADO資料操作的核心,它既可以作為Connection
物件或Command物件執行特定方法的結果資料集,也可以獨立於這兩個
物件而使用,由此可以看出ADO物件在使用上的靈活性。
  上面3個物件都包含一個Property物件集合的屬性,透過Property
物件可使ADO動態暴露出底層OLE DB提供者的效能。由於並不是所有
的底層提供者都有同樣的效能,所以ADO 允許使用者動態訪問底層提供
者的能力。這樣既使得ADO很靈活,又提供了很好的擴充套件性。
  ADO的其他集合物件及其元素物件,都用在特定的上下文環境中,
比如Parameter物件一定要與某個Command物件相聯絡後,才能真正起
作用。而另外三個物件Field、Error和Property物件只能依附於其父
物件,不能單獨建立這些物件。
  三、在多種語言中使用ADO
  以上介紹了ADO的物件模型,現在我們來討論如何在不同的語言環
境中使用ADO物件。
  因為ADO是作為自動化元件程式實現的,所以我們可以在任何支援
COM和自動化特性的語言環境中使用ADO,比如Visual Basic、Visual
C++、ASP和Java等等,下面分別加以介紹。
  1. 在Visual Basic應用中使用ADO
  Visual Basic應用在設計模式和執行模式下都可以建立和使用自
動化物件,在設計模式下,像ADO這樣的物件庫可以作為內部物件來使
用,我們只需在"Project"選單下的"Ref erences"命令彈出的對話方塊
中選中ADO物件庫"Microsoft Data Objects Libra ry",於
是我們就可以在程式中直接宣告或新建ADO物件,舉例如下:
  Dim cn as New ADODB.Connection
  Dim cmd as New ADODB.Command
  Dim rs as New ADODB.Recordset
  可以看出,在設計時使用ADO物件非常方便,而且Visual Basic設
計環境中提供的物件(Object Browser)功能允許使用者很方便地
檢視ADO物件的屬性和方法。
  我們也可以在執行時建立自動化物件,使用Visual Basic的Creat
eObject可以建立任意的自動化物件,由於ADO中只有Connection
物件、Command物件和Recordset物件可以被獨立建立,所以我們也只
能建立這3種物件,舉例如下:
  Dim cn
  Set rs=CreateObject("ADODB.Connection ")
  Dim cmd
  Set rs=CreateObject("ADODB.Command")
  Dim rs
  Set rs=CreateObject("ADODB.Recordset")
  不管是設計模式還是執行模式,呼叫ADO物件的屬性和方法都非常
簡單,直接呼叫即可。
  2. 在ASP的中使用ADO
  ADO物件也可以用於HTML和Active Server Page的VBScript指令碼
程式碼,VBScript指令碼程式碼與Visual Basic的程式碼很類似,它們內嵌在HT
ML或ASP檔案的特定標記對內部。但Script引擎比Visual Basic的
設計環境或執行庫在功能上還是要弱一些,首先,在VBScri pt程式碼中,
沒有與設計環境類似的用法,VBScript引擎不能裝入ADO型別庫,所以
不能使用New運算子建立ADO物件,但可以使用CreateObject函式建立
物件;其次,ADO物件庫中用到的常量只能透過包含檔案引入,隨ADO一
起提供的Adovbs.inc檔案包含所有ADO常量的定義,我們可在指令碼程式碼
中直接包含此檔案。
  因此,為了在VBScript程式碼中使用ADO,首先要包含Adovbs.inc文
件,然後使用Create Object函式建立ADO物件,以後就可以呼叫這些對
象的屬性或方法了。下面的例子顯示了在ASP檔案中用ADO列出資料表
中所有作者的姓名和職稱,程式碼如下:
  Using ADO in a Visual Basic Script Web Page
  Using ADO in a Visual Basic Script
  Web Page
  myConnection.Open "DSN=MySamples;UID=sa"
  SQLQuery = " AuthorName, Title from AuthorDB"
  set rs = myConnection.Execute(SQLQuery)%
  WIDTH=200
  Title ID
  SIZE=1
  Title
  "arial narrow" size=1
  "arial narrow" size=1
  3. 在Visual C++中使用ADO
  在Visual C++中使用ADO有多種方法,第一種方法是我們使用CoCr
eateInstance函式建立ADO物件,並得到物件的IDispatch介面指標,然
後呼叫其Invoke函式,用這種方法需要我們自己處理引數和返回值,AD
O提供了Adoid.h和Adoint.h標頭檔案分別定義了ADO物件的CLSID和介面
ID;第二種方法是利用#import編譯指示符(在Visual C++ 5.0及以後
的版本中可以使用),可以方便地使用ADO物件;第三種方法是利用MFC(
Microsoft Foundation C lass)庫提供的IDispatch介面封裝類COleD
ispatch建立和呼叫ADO物件。
  下面的程式碼顯示了在Visual C++建立資料來源連線的過程:
  GUID connectionCLSID;
  HRESULT hResult = ::CLSIDFromProgID(L"ADODB.Connection",
  &connectionCLSID);
  if (FAILED(hResult))
  {
  ......
  }
  IDispatch *pDispatch = NULL;
  hResult = CoCreateInstance(connectionCLSID, NULL,
  CLSCTX_SERVER, IID_IDispatch, (void **)&pDispatch);
  if (FAILED(hResult))
  {
  ......
  }
  COleDispatchDriver driver;
  driver.AttachDispatch(pDispatch, FALSE);
  TRY
  {
  BYTE parms =VTS_BSTR;
  driver.InvokeHelper(0xa, DISPATCH_METHOD,
  VT_EMPTY, &hResult, parms,L"Provider=SQLOLEDB;
  User ID=sa;Pass=;" L"Initial Catalog=LEAVES;
  Data Source=NetTestServer");
  }
  END_TRY
  driver.DetachDispatch();
  ......
  4. 在Java中使用ADO
  在Java程式中可以引入ADODB類,然後宣告ADO變數,也可以使用ne
w運算子建立ADO變數。下面的程式碼說明了如何在Java中開啟與資料來源
連線:
  import msado10.*;
  _Connection m_conn = null;
  _Recordset m_rs = null;
  _Command m_cmd = null;
  void OpenConnection()
  {
  String s;
  Properties properties;
  try
  {
  properties = m_conn.getProperties();
  m_conn.Open("dsn=MySamples", "sa", "");
  properties = null;
  }
  catch (Exception e)
  { System.out.println(" Unable to make a connection ")
;
  }
  }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963066/,如需轉載,請註明出處,否則將追究法律責任。

相關文章