直播中
用最抽象的話來(lái)說(shuō),ADO+ 是具有更大的可伸縮性和互操作性的 ADO。就對(duì)象模型及編程問(wèn)題而言,ADO 與 ADO+ 是完全不同的兩個(gè)實(shí)體。盡管這樣,ADO+ 源自 ADO 并保留了它的鼓舞人心的原則。
以更多互操作性和可伸縮性充實(shí) ADO 的關(guān)鍵在于斷開(kāi)這個(gè)概念。在允許客戶機(jī)端的腳本代碼實(shí)現(xiàn)諸如排序、過(guò)濾和文檔/視圖模型之類的有趣和交互式功能的同時(shí),斷開(kāi)的記錄集作為一種保留系統(tǒng)資源的方式被引入到 ADO 2.0 中。ADO+ 與 ADO 相比具有三個(gè)主要優(yōu)點(diǎn):互操作性、增強(qiáng)的可伸縮性以及強(qiáng)類型。此外,ADO+ 便于數(shù)據(jù)組件間的數(shù)據(jù)共享以及在表中的記錄間進(jìn)行導(dǎo)航。
ADO+ 從一開(kāi)始就被設(shè)計(jì)為對(duì)斷開(kāi)的數(shù)據(jù)集進(jìn)行操作。斷開(kāi)的記錄集只能有益于應(yīng)用程序,因?yàn)樗鼈兪菙?shù)據(jù)的本地視圖,能夠較快地處理和傳輸數(shù)據(jù)。ADO+ 將 XML 用作通用的傳輸格式。只要接收組件運(yùn)行于有 XML 分析程序可用的平臺(tái)上,就可以提供許多功能,同時(shí)確?;ゲ僮餍?。通過(guò) XML 進(jìn)行傳輸時(shí),接收者不再必須是一個(gè) COM 對(duì)象。XML 是一種簡(jiǎn)單但卻功能強(qiáng)大的基于文本的標(biāo)準(zhǔn),它近來(lái)已廣為業(yè)界所接受,因而,目前有理由期待差不多每個(gè)平臺(tái)上都會(huì)有一個(gè) XML 分析程序。這樣的話,接收組件就不會(huì)有任何的體系結(jié)構(gòu)限制。任何一對(duì)軟件組件都可以共享 ADO+ 數(shù)據(jù),只要它們同意將相同的 XML 架構(gòu)用于傳輸數(shù)據(jù)格式。圖 2 對(duì) ADO+ 適用于現(xiàn)有體系結(jié)構(gòu)的方式進(jìn)行了說(shuō)明。
<img src=http://www.asia.microsoft.com/china/msdn/images/adoplus02.gif>
圖 2. 在 DNA 方案中使用 ADO+
表示層可以通過(guò) Win Forms 或 Web Forms(這兩種編程單元專用于 Microsoft Visual Studio.NET 平臺(tái))使用或創(chuàng)建數(shù)據(jù)集。在任一種情況下,運(yùn)行于業(yè)務(wù)層的組件都接收一個(gè) XML 流并進(jìn)行任意處理。這些組件可以重新構(gòu)建一個(gè) ADO+ 環(huán)境,也可以將數(shù)據(jù)按原始 XML 處理并使其適合于發(fā)送到物理數(shù)據(jù)存儲(chǔ)器中。業(yè)務(wù)組件可以獲取 ADO+ 數(shù)據(jù),將其轉(zhuǎn)換為 XML,然后將其發(fā)送回客戶機(jī)。任何可以理解 XML 的應(yīng)用程序都可以在任一點(diǎn)上介入這一架構(gòu)。
可伸縮性是分布式系統(tǒng)在不喪失效率的情況下對(duì)數(shù)目逐漸增長(zhǎng)的客戶機(jī)進(jìn)行服務(wù)的能力??缮炜s性是一個(gè)常與數(shù)據(jù)庫(kù)有關(guān)的術(shù)語(yǔ),這是由于分布式系統(tǒng)很大程度上依賴于數(shù)據(jù)庫(kù)??缮炜s性無(wú)論對(duì)于數(shù)據(jù)庫(kù)服務(wù)器還是對(duì)于封裝了數(shù)據(jù)訪問(wèn)操作的任何軟件制品都是一個(gè)可以持續(xù)存在的問(wèn)題??缮炜s性的最大敵人就是對(duì)關(guān)鍵資源的濫用。在分布式系統(tǒng)中,關(guān)鍵通常意味著有限。數(shù)據(jù)庫(kù)連接就是可以影響可伸縮性的關(guān)鍵資源的一個(gè)示例。固定數(shù)目的連接的可用性對(duì)系統(tǒng)的增長(zhǎng)及其能力形成了一個(gè)實(shí)際的限制。好的軟件了解這種情況并采取適當(dāng)措施限制其影響。ADO+ 對(duì)這一問(wèn)題的處理是怎樣優(yōu)于 ADO 的呢?并不是說(shuō) ADO 是不可伸縮的,而是說(shuō)對(duì)斷開(kāi)的和內(nèi)存中的表的內(nèi)在使用(這是 ADO+ 的特征)使 ADO+ 成為內(nèi)在具有更大可伸縮性的解決方案。它具有更大可伸縮性的原因在于斷開(kāi)的數(shù)據(jù)集不在很長(zhǎng)的時(shí)間內(nèi)保留鎖或保持打開(kāi)連接。如果使用 ADO,您必須編寫代碼才能獲得這一功能;而使用 ADO+ 則會(huì)免費(fèi)獲得這一功能。
將 XML 用作數(shù)據(jù)集的傳輸語(yǔ)言可以比 ADO 更有效地進(jìn)行數(shù)據(jù)共享。首先,繞過(guò)諸如記錄集之類的 COM 對(duì)象所必需的 COM 匯集使組件可以使用它們要使用的任意數(shù)據(jù)類型的集合。這還會(huì)帶來(lái)更好的性能,因?yàn)椴辉傩枰_保記錄符合標(biāo)準(zhǔn)的 COM 數(shù)據(jù)類型的數(shù)據(jù)類型轉(zhuǎn)換。XML 和 HTTP 的使用還允許數(shù)據(jù)跳過(guò)防火墻。正常情況下,防火墻允許 HTTP 數(shù)據(jù)包通過(guò),但會(huì)阻止任何試圖經(jīng)由端口號(hào)不是 80 的端口進(jìn)來(lái)的任何其它內(nèi)容通過(guò)。
--------------------------------------------------------------------------------
ADO+ 的構(gòu)成要素
現(xiàn)在我要介紹主要的 ADO+ 對(duì)象。我們以所有內(nèi)容的起源開(kāi)始,即 DataSet 對(duì)象。
數(shù)據(jù)集是 ADO 記錄集的演化。數(shù)據(jù)集不過(guò)是數(shù)據(jù)庫(kù)的斷開(kāi)連接的內(nèi)存中的視圖。就您可以擁有動(dòng)態(tài)創(chuàng)建的數(shù)據(jù)集和數(shù)據(jù)表而不需要來(lái)自數(shù)據(jù)庫(kù)管理系統(tǒng) (DBMS) 的任何信息而言,數(shù)據(jù)集與數(shù)據(jù)源沒(méi)有任何嚴(yán)格意義上的關(guān)系。換句話說(shuō),數(shù)據(jù)集使用了一些添加到 ADO 記錄集中的功能:斷開(kāi)時(shí)工作的能力以及計(jì)劃性地創(chuàng)建并以任何種類數(shù)據(jù)進(jìn)行置入。數(shù)據(jù)集可以包含任意數(shù)目的表,每個(gè)表通常(但不總是)對(duì)應(yīng)于一個(gè)數(shù)據(jù)庫(kù)表或視圖。DataTable 對(duì)象對(duì)應(yīng)的表不過(guò)是一些行與列的集合。每一行保留其原始狀態(tài)及其當(dāng)前狀態(tài)。
ADO 記錄集一直經(jīng)常以一種充當(dāng)某種超級(jí)數(shù)組的通用數(shù)據(jù)類型出現(xiàn)。同樣,ADO+ 數(shù)據(jù)集是一種提供以下功能的超級(jí)記錄集:
一種容納數(shù)據(jù)的更好和更豐富的編程接口。
一種不需要與實(shí)際數(shù)據(jù)源的任何內(nèi)在綁定而提供更為廣義的數(shù)據(jù)視圖的對(duì)象模型。
一種用于輸入和輸出的基于 XML 的標(biāo)準(zhǔn)控制臺(tái)。
ADO 記錄集基本上是一種(可能是分層的)記錄集合,它帶有一些特定方法,用于完成一些有趣功能。其中包括包括滾動(dòng)、排序、過(guò)濾、書簽。記錄集本質(zhì)上是表在內(nèi)存中的副本。而數(shù)據(jù)集看起來(lái)更象 SQL Server 或 Access 數(shù)據(jù)庫(kù),它是一個(gè)包含更多表、特定視圖和外鍵關(guān)系的實(shí)體。
數(shù)據(jù)集對(duì)象模型反映了這一較大的范圍,它允許您查看跨越多個(gè)數(shù)據(jù)表、關(guān)系、擴(kuò)展屬性和行的多個(gè)集合的可用數(shù)據(jù) — 這還可用于說(shuō)明非持久數(shù)據(jù)或只是來(lái)自不是數(shù)據(jù)庫(kù)的另一個(gè)持久存儲(chǔ)介質(zhì)的數(shù)據(jù)。
ADO 記錄集允許您將內(nèi)容保存到 XML 中,并從一個(gè)外部 XML 文件重新構(gòu)建該內(nèi)容。然而,采用的缺省 XML 架構(gòu)是針對(duì)導(dǎo)出/導(dǎo)入 ADO 記錄集而優(yōu)化的,而不是針對(duì)實(shí)際數(shù)據(jù)交換。ADO XML 架構(gòu)包含許多關(guān)于列類型和位置以及其它元數(shù)據(jù)的信息。如果您希望從某一 XML 文檔中重新構(gòu)建記錄集,則這些信息是至關(guān)重要的,但如果您只是希望傳遞數(shù)據(jù)并使接收者使用它,則這些信息沒(méi)有什么用處。有了 ADO+ 數(shù)據(jù)集,XML 架構(gòu)更為精練,因?yàn)楸槐硎镜膶?duì)象與關(guān)系數(shù)據(jù)庫(kù)沒(méi)有直接關(guān)系,盡管對(duì)象可以用來(lái)精密地再現(xiàn)數(shù)據(jù)庫(kù)。ADO+ 數(shù)據(jù)集對(duì)數(shù)據(jù)進(jìn)行描述,而 ADO 記錄集則對(duì)由某一表中獲取的一個(gè)記錄集合進(jìn)行描述。這就是 ADO+ 數(shù)據(jù)模型的動(dòng)人之處。
ADO+ XML 架構(gòu)只是再現(xiàn)表以及數(shù)據(jù)集中定義的關(guān)系,構(gòu)建一個(gè) DataSet 對(duì)象的責(zé)任則留給 ADO+ 運(yùn)行時(shí)完成。ADO XML 格式由于過(guò)于具體而無(wú)法真正實(shí)現(xiàn)互操作。它還由于過(guò)于繁瑣,如果不進(jìn)行數(shù)據(jù)壓縮的人工干預(yù),它就無(wú)法進(jìn)行高效的匯集。ADO+ 數(shù)據(jù)集體系結(jié)構(gòu)的鼓舞人心的原則與導(dǎo)致我創(chuàng)建 JavaScript 的 Recordset 對(duì)象的原因之間存在一種底層的相似之處。在這兩種情形中,您都將數(shù)據(jù)說(shuō)明(例如,一個(gè) XML 字符串)轉(zhuǎn)換為一個(gè)專用于平臺(tái)的操作對(duì)象(即一個(gè) JavaScript 對(duì)象)。在這樣做的過(guò)程中,您安全地將您的數(shù)據(jù)從一層發(fā)送到另一層,而不考慮安裝的操作系統(tǒng)或軟件。
--------------------------------------------------------------------------------
ADO+ 命令
盡管 DataSet 對(duì)象提供一個(gè)內(nèi)存中數(shù)據(jù)存儲(chǔ)的工具,您還需要另一個(gè)工具對(duì)各種表進(jìn)行創(chuàng)建和初始化。這一工具就是 DataSetCommand 對(duì)象,它代表一個(gè)將使用連接和命令的細(xì)節(jié)隱藏起來(lái)的集中式控制臺(tái)。DataSetCommand 對(duì)象允許某一 DataSet 對(duì)象與源數(shù)據(jù)存儲(chǔ)器間的數(shù)據(jù)檢索和保存。它負(fù)責(zé)從物理存儲(chǔ)器中提取數(shù)據(jù),然后將其推送到各數(shù)據(jù)表和關(guān)系中。DataSetCommand 對(duì)象還負(fù)責(zé)向?qū)嶋H數(shù)據(jù)庫(kù)傳輸任何更新、插入或刪除操作。DataSetCommand 對(duì)象通過(guò)底層 OLE DB 提供者能夠理解的 SQL 命令或命令字符串完成這一功能。DataSetCommand 對(duì)象以兩種形式存在:
SQLDataSetCommand 對(duì)象
ADODataSetCommand 對(duì)象
它們可以被當(dāng)作在數(shù)據(jù)表和數(shù)據(jù)源中的對(duì)應(yīng)表之間的代理。數(shù)據(jù)源是用于 SQLDataSetCommand 對(duì)象的 SQL Server 7.0(或更新版本)以及用于 ADODataSetCommand 對(duì)象的任何其它 OLE DB 提供者。
一般說(shuō)來(lái),ADO+ 能夠識(shí)別并處理兩種類型的數(shù)據(jù)源:SQL Server 7.0(及更新版本)以及可以通過(guò) OLE DB 提供者進(jìn)行訪問(wèn)的任何數(shù)據(jù)源。這些又稱為被管理的提供者。
作為使用 DataSetCommand 對(duì)象的一種替換(如代碼示例 1 中所示),您可以通過(guò)使用諸如連接和命令之類的較為熟悉的對(duì)象,直接對(duì)被管理的提供者進(jìn)行操作。
代碼示例 1
Dim oDS as DataSet
Dim oCMD as SQLDataSetCommand
oDS = New DataSet
oCMD = new SQLDataSetCommand("Select * from employees", strConn)
oCMD.FillDataSet(oDS, "EmployeesList")
Dim oRow as DataRow
For Each oRow in oDS.Tables(0).Rows
Console.WriteLine(oRow(0).ToString())
Next
通過(guò)查看這種類型的 ADO+ 代碼,您會(huì)發(fā)現(xiàn)它與舊式的 ADO 編程沒(méi)有多大的差別。它具有新的對(duì)象、新的編程接口、經(jīng)過(guò)改進(jìn)的新功能,但代碼模式相同。如代碼示例 2 中所示。
代碼示例 2
Dim oCN As SQLConnection
Dim oCMD As SQLCommand
Dim oDR As ADODataReader
oCN = New SQLConnection(strNWind)
oCMD = New SQLCommand("MyStoredProc 'Davolio'", oCN)
oCMD.CommandType = CommandType.StoredProcedure
Try
oCN.Open()
oCMD.Execute(oDR)
While oDR.Read
Console.WriteLine(oDR("LastName").ToString))
End While
Catch e As Exception
Console.WriteLine(e.ToString)
Finally
oDR.Close()
oCN.Close()
End Try
請(qǐng)注意,上述代碼具有 Microsoft Visual Basic® 7.0 引入的一些語(yǔ)法元素的特征 — 特別是最終取代了 On Error 機(jī)制的 Try-Catch 結(jié)構(gòu)。ADO+ 代碼充分利用了提供諸如 Console 之類的系統(tǒng)對(duì)象的.NET 運(yùn)行時(shí)服務(wù)。
還有什么特殊的功能可以幫助您確定革新的 DataSetCommand 方法是否優(yōu)于使用傳統(tǒng)的 ADO 嗎?通過(guò)使用 DataSetCommand 對(duì)象與數(shù)據(jù)源進(jìn)行通信,基本上與通過(guò)使用 ADO 連接和命令相同,并帶有一個(gè)重要的推論:所有的 ADO+ 對(duì)象,如 DataSetCommand 對(duì)象,都可以通過(guò)派生新的、更專用的類而進(jìn)行定制。因此,舉例來(lái)說(shuō),您可以控制將數(shù)據(jù)集的更改傳送到數(shù)據(jù)庫(kù)的方式,以及(比方說(shuō))優(yōu)化性能、對(duì)數(shù)據(jù)進(jìn)行壓縮或加密、執(zhí)行數(shù)據(jù)驗(yàn)證以及許多其它功能。
--------------------------------------------------------------------------------
強(qiáng)類型編程
您通過(guò) ADO 對(duì)數(shù)據(jù)庫(kù)對(duì)象和類似 Recordset 和 Fields 的集合進(jìn)行操作。除了將實(shí)際數(shù)據(jù)視為某種參數(shù)外,這種方法沒(méi)有什么錯(cuò)誤:
Set oRS = New ADODB.Recordset
oRS.Open strSQL, strConn
While Not oRS.EOF
MsgBox oRS("FirstName") & " " & oRS("LastName")
oRS.MoveNext
Wend
在上述 ADO 代碼片斷中,第一個(gè)和最后一個(gè)名稱被用作進(jìn)入 Recordset 和 Fields 集合的入口點(diǎn)。由于 Visual Basic 的缺省屬性,您可以編寫相對(duì)容易閱讀的代碼。依照 ADO,某一給定記錄字段的“完整對(duì)象模型路徑”應(yīng)為:
oRS.Fields("firstname").value
此外,ADO 總是使用 Variant 數(shù)據(jù)類型,以便與基于腳本的環(huán)境(特別是 ASP)相一致。
ADO+ 通過(guò)提供借助數(shù)據(jù)的自然名稱對(duì)存儲(chǔ)于數(shù)據(jù)集中的數(shù)據(jù)進(jìn)行訪問(wèn)的能力,使數(shù)據(jù)庫(kù)編程更進(jìn)了一步。如果要在某一數(shù)據(jù)集中尋址某一表,您可以使用該表的 ADO+ 名稱并對(duì)使用列和行的名稱對(duì)列和行進(jìn)行訪問(wèn),而不是通過(guò)基于集合的方法。此外,所有的有關(guān)變量都擁有一個(gè)特定的(與 Variant 相對(duì))數(shù)據(jù)類型。這稱為強(qiáng)類型編程。上面顯示的對(duì)一個(gè) Employees 表中的 FirstName 和 LastName 進(jìn)行操縱的代碼可以按下面的形式重新編寫:
MsgBox Employees.FirstName & " " & Employees.LastName
一種具有類型的 DataSet 即是一個(gè)自 DataSet 繼承的類。采用數(shù)據(jù)集的強(qiáng)類型版本是有益的,原因是 IDE 自身可以實(shí)時(shí)地向您通知可能的類型不匹配錯(cuò)誤,而且 Microsoft IntelliSense® 技術(shù)可以隨時(shí)向您建議一些方法和屬性。
--------------------------------------------------------------------------------
摘要
ADO+ 不僅僅是對(duì)數(shù)據(jù)進(jìn)行操作的另一個(gè)對(duì)象模型。從本質(zhì)上說(shuō),它是在范圍更廣、跨平臺(tái)方案中的 ADO 的重現(xiàn)。ADO+ 是擴(kuò)展的 ADO,它在能夠理解 XML 的任何平臺(tái)上與任何軟件組件協(xié)同工作。它對(duì)數(shù)據(jù)進(jìn)行建模,而不是對(duì)數(shù)據(jù)庫(kù)或數(shù)據(jù)提供者。它從數(shù)據(jù)庫(kù)基礎(chǔ)結(jié)構(gòu)中提取數(shù)據(jù),并將其置于一種中性的環(huán)境中,數(shù)據(jù)在這種環(huán)境中就是數(shù)據(jù),無(wú)論存儲(chǔ)介質(zhì)、物理結(jié)構(gòu)或用來(lái)對(duì)其進(jìn)行訪問(wèn)的 API 究竟是什么。其關(guān)鍵即是 XML,它代表了一種用于 ADO+ 數(shù)據(jù)集的 I/O 控制臺(tái)。另一個(gè)重要的方面是主要對(duì)象(即數(shù)據(jù)集)的斷開(kāi)連接和在內(nèi)存中的性質(zhì)。
因此,您可以發(fā)送數(shù)據(jù)的 XML 說(shuō)明,并讓 ADO+ 服務(wù)器端的組件將其構(gòu)建為一個(gè)數(shù)據(jù)集。您也可以擁有非 ADO+ 組件,它們只是獲取該 XML 說(shuō)明后對(duì)其運(yùn)行自己的分析程序并獲得同樣的結(jié)果。ADO+ 專用于 Windows,但它可以與幾乎所有的平臺(tái)交換數(shù)據(jù)。請(qǐng)留意跟蹤 ADO+ 演變的后續(xù)文章。