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ō)明。
圖 2. 在 DNA 方案中使用 ADO+
表示層可以通過(guò) Win Forms 或 Web Forms(這兩種編程單元專(zhuān)用于 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)。
將 XML 用作數(shù)據(jù)集的傳輸語(yǔ)言可以比 ADO 更有效地進(jìn)行數(shù)據(jù)共享。首先,繞過(guò)諸如記錄集之類(lèi)的 COM 對(duì)象所必需的 COM 匯集使組件可以使用它們要使用的任意數(shù)據(jù)類(lèi)型的集合。這還會(huì)帶來(lái)更好的性能,因?yàn)椴辉傩枰_保記錄符合標(biāo)準(zhǔn)的 COM 數(shù)據(jù)類(lèi)型的數(shù)據(jù)類(lèi)型轉(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 記錄集允許您將內(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)于列類(lèi)型和位置以及其它元數(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è)專(zhuān)用于平臺(tái)的操作對(duì)象(即一個(gè) Javascript 對(duì)象)。在這樣做的過(guò)程中,您安全地將您的數(shù)據(jù)從一層發(fā)送到另一層,而不考慮安裝的操作系統(tǒng)或軟件。
盡管 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í)別并處理兩種類(lèi)型的數(shù)據(jù)源:SQL Server 7.0(及更新版本)以及可以通過(guò) OLE DB 提供者進(jìn)行訪問(wèn)的任何數(shù)據(jù)源。這些又稱(chēng)為被管理的提供者。
MsgBox Employees.FirstName & " " & Employees.LastName
一種具有類(lèi)型的 DataSet 即是一個(gè)自 DataSet 繼承的類(lèi)。采用數(shù)據(jù)集的強(qiáng)類(lèi)型版本是有益的,原因是 IDE 自身可以實(shí)時(shí)地向您通知可能的類(lèi)型不匹配錯(cuò)誤,而且 Microsoft IntelliSense® 技術(shù)可以隨時(shí)向您建議一些方法和屬性。