ADO 2.5物件模型

來源:互聯網
上載者:User
ado|對象


    雖然在ADO 2.5物件模型中出現了兩個新對象,但與以前的版本基本上是類似的。圖8-3顯示了這些對象以及每個對象之間的關係:

       如果以前使用過ADO,你會發現在這個新版本中出現了兩個新對象:Stream和Record對象。在第11、12章將詳細介紹它們。
    Properties集合已經被有意地排除在圖8-3外,這樣你對幾個主要對象之間的互動關係就一目瞭然了。在本章的後面,有顯示Properties集合的簡化物件模型。
       讓我們更詳細地考察這幾個對象。

8.2.1 Connection對象
       Connection對象是使我們能與資料存放區相連的對象。只有Connection對象才能指定希望使用的OLE DB提供者、串連到資料存放區的安全細節以及其他任何串連到資料存放區特有的細節。
       應用注意的是,不必顯式建立一個Connection對象以串連到資料存放區。儘管確實需要指定串連細節,但沒有Connection對象,一樣可以建立Command、Recordset和Record對象。如果不建立自己的Connection對象,ADO將會隱含地為你建立一個Connection對象。如果要對提供者運行多條命令,應該顯式地建立一個Connection對象,這比每運行一條命令就建立一個串連更有效。
       除了為資料存放區提供串連以外,Connection對象允許針對資料存放區執行命令操作。這些命令可以是結構化的或儲存的命令(例如,SQL命令或一個預存程序),並且可以有選擇地從資料存放區中返回一些資料。

8.2.2 Command對象
       Command對象是對資料存放區執行命令的對象。看到這裡讀者可能會產生疑問,Connection對象不也能這樣做嗎?是的,但是Connection對象在處理命令的功能上受到一定的限制,而Command對象是特別為處理命令的各方面問題而建立的。實際上,當從Connection對象中運行一條命令時,已經隱含地建立一個Command對象。
       有時其他對象允許向命令傳入參數,但在Connection對象中不能指定參數的任何細節。使用Command對象允許指定參數(以及輸出參數和命令執行後的傳回值)的精確細節(比如,資料類型和長度)。
       因此,除了執行命令和得到一系列返回記錄,也可能得到一些由命令提供的附加資訊。
       對於那些不返回任何記錄的命令,如插入新資料或更新資料的SQL查詢,Command對象也是有用的。

8.2.3 Recordset對象
       Recordset對象是ADO中使用最為普遍的對象,因為它含有從資料存放區中提取的資料集。我們經常運行不返回資料的命令,比如那些增加或更新資料的命令,但在大多數情況下很有可能會取得一系列記錄。
       Recordset對象是擁有這些記錄的對象。可以更改(增加、更新和刪除)記錄集中的記錄,上下移動記錄,過濾記錄並只顯示部分內容等等。Recordset對象也包含Fields集合,Fields集合中有記錄集中每一個欄位(列)的Filed對象。
       無論是在ASP頁面中處理資料,還是利用遠端資料服務(RDS)遠程使用資料,Recordset對象是必須處理的對象。

8.2.4 Record對象
       ADO 2.5以前的版本在處理結構化資料上是很有效,比如從資料庫中取出記錄集,但無法處理每一行的列(也就是列數和資料類型)可能不同的資料。對於SQL資料這不是一個問題,但對於檔案和郵件系統,Web伺服器和別的諸如此類的資料存放區會如何呢?我們把這些資料看作是半結構化的資料,與記錄集相比結構性較差,但與那些常用來代表文本或映像的位元據相比更具有結構性。
       通常,半結構化資料的儲存採用樹狀結構來組織,有節點、子節點和檔案。例如,設想一個有檔案夾、子檔案夾和檔案的Web網站。圖8-4所示的螢幕圖顯示了一台機器的Web網站,特別是還有一個名為public的虛擬目錄:

       如果一定要在ADO中進行建模,會覺得這非常適合記錄集,可能是嵌套的記錄集。然而注意高亮度顯示的目錄,該目錄含有不同類型的檔案,裡面有幾個目錄、兩個ASP檔案、一個文字檔和一個WORD文檔。你會很容易地將其映射到一個擁有名稱、類型、上次存取時間等欄位的記錄集,遺憾的是並不是這樣簡單。對於存取權限而言,在檔案和目錄之間就有區別。對於目錄,需要的是能訪問目錄下的檔案;而對於檔案,卻可能是需要訪問其內容。
       由於其複雜性,引入了Record對象。在上面的情況下,存在有一些相同屬性的條目的一個集合,但是每個條目也有獨特的屬性,因此需要使用別的方法去處理這些資料。把一個集合映射到一個記錄集,一個單獨的檔案對應成一條記錄,相應的檔案屬性就映射成Fields集合。
       這意味著有了一個含有六行記錄的記錄集。訪問記錄集中單獨的一行就會得到該檔案的屬性(欄位),但是提供給我們的僅僅是屬性,為了訪問檔案或目錄的內容,需要使用Record對象,該對象包含檔案或目錄的獨特屬性。習慣於這個概念有一定的困難,但不必擔心,在第11、12章你會看到更多有關Record對象的例子。       Windows 2000初始版本發布以來,只有用於Internet發布的OLE DB提供者使用Record對象。一旦微軟Exchange 6.0發布,將成為以類似方法利用記錄集和記錄提供對Exchange資訊庫訪問的OLE DB提供者。
8.2.5 Stream對象
       Stream對象用於訪問節點的內容,比如一個E-Mail訊息,或一個Web頁面。利用Stream對象可以訪問檔案或資源的真實內容。因此,結合Record和Recordset對象,不僅可以訪問Web伺服器上的檔案或email訊息,還可以訪問相應的內容。這樣,就可以建立一個只使用ADO去訪問郵件系統的郵件客戶。這也許不會有太多的優點,但意味著可不必瞭解郵件系統的API或物件模型,減少了學習上的彎路。
       Stream的另一個用途是XML,可以訪問一系列作為XML流的資料(結構化或半結構化)。
       Stream對象用來處理位元據,所以,可以用來處理BLOB類型的資料,比如資料庫中的映像或大文本資料。
       同樣,在本書第11、12章中你會看到更多的有關Stream對象的例子。

8.2.6 集合
       ADO物件程式庫中有一些集合,每個集合都有零個或更多個與其關聯的對象的拷貝。可以使用相同的代碼結構去遍曆這些集合。
       在VBScript中的文法是:
       For Each object In Collection
              ' Do something with object
       Next
       例如,遍曆一個Recordset對象的Fields集:
       For Each objField In rs.Fields
              Response.Write objField.Name & "<BR>"
       Next
       如果選擇JScript,那麼可以使用Enumerator對象:
       for (objField = new Enumerator(rs.Fields);
              !objField.atEnd(); objField.moveNext())
              Response.Write (objField.item().Name + '<BR>');
1.  Fields集合
Fields集合擁有與記錄集或記錄關聯的Field對象。對基於結構化資料的記錄集,比如SQL資料,欄位相應於資料中的列,並含有列的詳細內容,比如名稱、資料類型、長度等等。在以後幾章看到大量的關於Fields集合的例子。
對於半結構化的資料,對象的屬性相應於欄位。在第12章會看到更多的相關的介紹。
2.  Parameters集合
Parameters集合僅被Command對象使用,確定在儲存命令中的參數。SQL資料庫中的預存程序頻繁地使用參數,並允許資料傳入和傳出預定義的SQL語句。如果擁有向ADO返回資訊的參數,則會十分有用,因為這樣從預存程序中返回的就不只是一個記錄集。例如,考慮一個更新多個表然後返回一個記錄集的複雜預存程序,可以用一個輸出參數顯示更新了多少條記錄。
另一個使用參數的理由是效能問題,特別是在僅僅需要從預存程序返回單個值的時候。在這種情況下,沒有建立記錄集的必要,只需要儲存一個值即可,因而不需要返回記錄集,而返回輸出參數的值是更為有效方法。
在第9章會看到有關Parameter集合的詳細介紹。
3.  Error集合
Error集合包含因運行命令而引起的上一次ADO或OLE DB提供者錯誤的詳細內容,只能被Connection對象訪問。可能會覺得這是個限制,因為不必顯式定義Connection對象,但可以通過Command、Recordset和Record對象的ActiveConnection屬性訪問隱含的Connection對象。例如:
For Each objError In rs.ActiveConnection.Errors
       Response.Write objError.Name & "<BR>"
Next
在本章後面,將詳細討論Error集合。
4.  Properties集合
為了避免混亂,Properties集合沒有在前面的物件模型圖表上加以顯示。它與物件模型的關係顯示在圖8-5中:

Properties集合存在的原因是因為ADO是用來處理許多不同的資料存放區,都有不同的特徵。將屬性(Property)組成一個集合,可以使之能夠動態地根據不同的資料提供者而隨時改變。例如,Jet的OLE DB提供者允許訪問Jet特殊的安全屬性:
Set conDB = Server.CreateObject ("ADODB.Connection")
conDB.Open "DSN=Nwind"

conDB.Properties ("Jet OLEDB:Database Password") = "LetMeIn"
其他的提供者沒有這個屬性,因此把它加到Connection對象中作為一個靜態屬性是不明智的。ADO根據所使用的OLE DB提供者,會用提供者預設值填充屬性集合。
雖然這裡有關於Properties集合的使用說明,但在本書中不準備詳細敘述Properties集合。要獲得更多的關於該集合的介紹,請參閱《Professional ADO 2.5 Programming》或《ADO 2.5 Programming's Reference》,兩者都由Wrox出版。

8.2.7 ADO常數
       當使用ADO時,會發現有許多預先定義的用於眾多選項的常數,比如定義游標類型和鎖類型的常數。使用像Visual Basic或Visual C++這樣的語言,一旦引用了ADO類型庫,自然會用到這些常數。在ASP中情況不同,有兩種選擇。
       引用常數的第一種方法是把它們包含進ASP檔案:
       <!-- #INCLUDE FILE="adovbc.inc" -->
       可以將包含檔案拷入本地目錄,或者從安裝目錄引用它,其預設路徑為C:Program FilesCommon FilesSystemado(以上檔案包含用於VBScript的ADO常數——對於JScript,應該使用adojavas.Inc)。使用這個方法的一點不足是會使ASP頁面變得過大,因為包含了全部的常數,而其中許多是不需要使用的。
       可以建立自己的只含有所需要的常數的包含檔案,但越來越多使用ADO的功能時,很可能會發現需要不斷地編輯、維護這個檔案。
       一個比較好的解決的方法是建立一個對類型庫的引用,這種方法不需要將常數包含進ASP檔案而直接可以引用常數:
       <!-- METADATA TYPE="typelib" FILE="C:Program Files
Common FilesSystemadomsado15.dll" -->
       不要懷疑這個DLL的名字是msado15.dll,這是一個正確的名字,包含最新版本的ADO。
       可以在需要的地方把這個METADATA語句包含進每一個ASP檔案,或者放入global.asa檔案,這樣應用程式中的每個Web頁面都可以引用這些常數。




相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。