ADO.NET:通向未來(lái)之橋
發(fā)表時(shí)間:2024-02-16 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]在Web跨入編程時(shí)代之前,對(duì)于大多數(shù)IT管理者和顧問(wèn)來(lái)說(shuō),數(shù)據(jù)訪問(wèn)只是一個(gè)相對(duì)而言的問(wèn)題;所有要用到的數(shù)據(jù)都必須自己準(zhǔn)備好。人們主要關(guān)心的問(wèn)題是選擇性能/價(jià)格比最好的數(shù)據(jù)庫(kù)服務(wù)器,系統(tǒng)涉及的所有模塊必須和服務(wù)器兼容?蛻魴C(jī)/服務(wù)器應(yīng)用是這種兩層模型最典型的范例。 隨著Web交互性的日益提高...
在Web跨入編程時(shí)代之前,對(duì)于大多數(shù)IT管理者和顧問(wèn)來(lái)說(shuō),數(shù)據(jù)訪問(wèn)只是一個(gè)相對(duì)而言的問(wèn)題;所有要用到的數(shù)據(jù)都必須自己準(zhǔn)備好。人們主要關(guān)心的問(wèn)題是選擇性能/價(jià)格比最好的數(shù)據(jù)庫(kù)服務(wù)器,系統(tǒng)涉及的所有模塊必須和服務(wù)器兼容?蛻魴C(jī)/服務(wù)器應(yīng)用是這種兩層模型最典型的范例。
隨著Web交互性的日益提高和應(yīng)用的日益廣泛,對(duì)于第三層——中間層的需求也越來(lái)越突出。中間層是一個(gè)邏輯層,數(shù)據(jù)訪問(wèn)組件通常就在這一層上。數(shù)據(jù)訪問(wèn)組件是唯一有必要了解數(shù)據(jù)庫(kù)細(xì)節(jié)的代碼,同時(shí),準(zhǔn)備更換或者升級(jí)數(shù)據(jù)庫(kù)服務(wù)器時(shí),數(shù)據(jù)訪問(wèn)組件也是第一個(gè)需要修改的地方。
接下來(lái),三層系統(tǒng)模型發(fā)展成了Windows DNA——現(xiàn)在稱為Microsoft .NET服務(wù)器系統(tǒng)。Microsoft利用一個(gè)統(tǒng)一的模型進(jìn)行數(shù)據(jù)訪問(wèn)。這個(gè)模型注重的是內(nèi)容,而不是數(shù)據(jù)格式和存儲(chǔ)媒介。它的具體表達(dá)方式建立在UDA(Universal Data Access,通用數(shù)據(jù)訪問(wèn))的基礎(chǔ)之上,而UDA正是激勵(lì)OLE DB體系發(fā)展的深層理念。為了提供一種通過(guò)VB和ASP COM組件方便地、無(wú)縫地訪問(wèn)OLE DB功能的途徑,Microsoft設(shè)計(jì)了ADO。ADO 2.0是用來(lái)支持OLE DB的第一個(gè)版本。在幾年之內(nèi),ADO發(fā)展到了2.6版本,增加和擴(kuò)展了XML支持,使得經(jīng)過(guò)擴(kuò)展的ADO對(duì)象模型能夠匹配所有OLE DB改進(jìn)功能(例如,對(duì)于OLE DB新增的Row和Stream對(duì)象,ADO 2.5提供了類似的ADO配套功能)。
ADO 2.0的核心功能超越了OLE DB。在多層系統(tǒng)中,隨著中間層組件的出現(xiàn),如何為表現(xiàn)層提供最新數(shù)據(jù)這一問(wèn)題也隨之出現(xiàn)。表現(xiàn)層怎樣訪問(wèn)數(shù)據(jù)?連接怎樣打開(kāi)?或者,我們是否應(yīng)該維護(hù)一份脫機(jī)記錄(即,一些斷開(kāi)連接之后仍舊能夠在表現(xiàn)層使用的數(shù)據(jù)庫(kù)記錄)?ADO 2.0以及它的更高版本同時(shí)提供了對(duì)服務(wù)器端游標(biāo)和脫機(jī)記錄集的支持(脫機(jī)記錄集是一種COM對(duì)象,它可以跨越網(wǎng)絡(luò)串行化,客戶可以下載它然后脫機(jī)使用)。
服務(wù)器端游標(biāo)代表著一個(gè)緊密結(jié)合的、保持連接的環(huán)境,在這個(gè)環(huán)境中我們總是維持著各個(gè)層之間的有效通道,只有結(jié)束時(shí)才拆除連接。與此相反,脫機(jī)記錄集是一個(gè)有狀態(tài)的對(duì)象,我們可以把它作為一個(gè)整體處理,且不必維持連接。脫機(jī)記錄集使用客戶端的靜態(tài)游標(biāo),能夠提供一個(gè)數(shù)據(jù)源的快照。對(duì)于那些只有讀取要求、且需要在各個(gè)系統(tǒng)層之間移動(dòng)數(shù)據(jù)的應(yīng)用程序來(lái)說(shuō),脫機(jī)記錄集是很理想的。今天,大多數(shù)Web應(yīng)用程序要求在各個(gè)層之間傳輸數(shù)據(jù)。為了獲取這些數(shù)據(jù),我們經(jīng)常使用快速的“只能向前”游標(biāo),用XML編碼數(shù)據(jù),然后通過(guò)網(wǎng)絡(luò)發(fā)送數(shù)據(jù),避免了在Web服務(wù)器上維持會(huì)話狀態(tài)信息。在分布式環(huán)境中,數(shù)據(jù)庫(kù)連接是一種關(guān)鍵性的資源,以脫機(jī)方式工作保證了高可伸縮性。
然而,Web是一把雙刃劍。Web讓我們連接到任何類型的聯(lián)機(jī)服務(wù),而且能夠與它們進(jìn)行交互。但是,Web也要求一定程度的互操作性,因?yàn)椴僮魉婕暗母鱾(gè)服務(wù)可能運(yùn)行在不同的軟件和硬件平臺(tái)上。我們可以通過(guò)利用開(kāi)放的標(biāo)準(zhǔn),以及那些不注重私有權(quán)的技術(shù)——甚至是象COM+這類廣泛應(yīng)用的私有技術(shù),跨越不同的平臺(tái)。
今天,基于Windows的Web數(shù)據(jù)訪問(wèn)應(yīng)用程序利用了ADO豐富的、方便的編程接口。然而,ADO對(duì)象天生地定位在Windows平臺(tái)上。ADO基于COM的本性使得記錄集很難在一個(gè)分布式、異種平臺(tái)構(gòu)成的環(huán)境中使用。另外,即使目標(biāo)平臺(tái)可能允許我們使用ADO記錄集,它也不具備最有效的機(jī)制。ADO.NET的DataSet和DataReader更有效;而且,如果沒(méi)有ADO.NET,有些時(shí)候我們還可以借助XML或純文本獲得高效率。
為了在Web環(huán)境下傳輸數(shù)據(jù),Microsoft對(duì)ADO記錄集進(jìn)行了優(yōu)化。但COM類型轉(zhuǎn)換仍舊是一個(gè)必不可少的步驟,因?yàn)镃OM的數(shù)據(jù)類型不可能總是匹配ADO記錄集的數(shù)據(jù)類型(例如,String類型必須轉(zhuǎn)換成BSTR類型)。由此,許多人把XML當(dāng)成了粘合各個(gè)層的“萬(wàn)能膠水”——不管涉及到了哪些平臺(tái)。通常的做法是:先提取一個(gè)記錄集,把它保存為XML格式,然后傳輸結(jié)果數(shù)據(jù)流,讓接收者從這個(gè)XML數(shù)據(jù)流重新構(gòu)造出記錄集供以后使用。隨著對(duì)協(xié)同工作能力和可伸縮性要求的提高,ADO不再是最理想的答案,因?yàn)樗皇墙⒃赬ML的基礎(chǔ)上——但ADO.NET是。
二、ADO在Web環(huán)境中的不足
.NET框架創(chuàng)立了一種取代COM和COM+的新組件模型。.NET的提出是Microsoft成熟的組件技術(shù)的新戰(zhàn)略。雖然幾個(gè)關(guān)鍵性的COM特色不再在.NET中出現(xiàn),但在某些方面,.NET與COM編程仍舊很相似。因此,COM程序員將能夠方便地轉(zhuǎn)向.NET開(kāi)發(fā)。ADO.NET是Microsoft特別為.NET框架設(shè)計(jì)的數(shù)據(jù)訪問(wèn)層,它在很大程度上利用了.NET的優(yōu)勢(shì)。
為什么.NET必須用一個(gè)新的數(shù)據(jù)訪問(wèn)層來(lái)替代現(xiàn)有的、廣泛應(yīng)用的數(shù)據(jù)訪問(wèn)接口,比如ADO?現(xiàn)代Web應(yīng)用系統(tǒng)必須具備客戶機(jī)/服務(wù)器應(yīng)用和桌面應(yīng)用的交互能力,Microsoft設(shè)計(jì).NET的目標(biāo)正是為了迎接設(shè)計(jì)現(xiàn)代Web應(yīng)用系統(tǒng)的挑戰(zhàn)。同時(shí),.NET也利用了各種Web協(xié)議廣泛的、強(qiáng)大的連接能力和協(xié)同操作能力。
在非Windows平臺(tái)上,ADO記錄集不能直接使用,從而使得協(xié)同操作能力受到了限制。為了突破這個(gè)限制,我們要把記錄集轉(zhuǎn)換成XML格式,然后傳輸轉(zhuǎn)換得到的XML記錄集。在ADO.NET中,把數(shù)據(jù)轉(zhuǎn)換成XML以及通過(guò)網(wǎng)絡(luò)傳輸?shù)牟僮鞯玫搅撕?jiǎn)化和優(yōu)化。另外,ADO對(duì)象模型中的每一個(gè)地方都體現(xiàn)了以數(shù)據(jù)庫(kù)為中心的思想。ADO把數(shù)據(jù)看成是一組來(lái)自數(shù)據(jù)源的記錄,而不是把數(shù)據(jù)看成一些獨(dú)立的信息。在ADO中,如果脫離了數(shù)據(jù)提供者用來(lái)保存和描述數(shù)據(jù)的結(jié)構(gòu),數(shù)據(jù)將不能獨(dú)立存在。
三、ADO.NET數(shù)據(jù)集和ADO記錄集
ADO.NET是從Web的角度對(duì)ADO進(jìn)行檢討和改進(jìn)。Microsoft對(duì)ADO.NET的設(shè)計(jì)嚴(yán)格地體現(xiàn)了其名字的含義:ADO,再加上.NET。ADO.NET自動(dòng)連接網(wǎng)絡(luò),致力于讓W(xué)eb數(shù)據(jù)訪問(wèn)變得更加簡(jiǎn)單和高效。兩個(gè)功能使得這方面的增強(qiáng)成為可能:脫機(jī)記錄集,以及與生俱來(lái)的對(duì)XML的支持。由于采用了脫機(jī)記錄集方案,ADO.NET自然也就不再支持服務(wù)器端游標(biāo)。ADO.NET天生就把記錄數(shù)據(jù)保存為XML文檔,把模式(Schema)和數(shù)據(jù)視為分離的、可替換的元素。
如果你認(rèn)為ADO早就提供了這些功能,它們并沒(méi)有什么創(chuàng)新意義,那么,ADO.NET還提供了其他許多新的功能。ADO.NET能夠使用連接的或者非連接的(脫機(jī)的)記錄集,具體由用戶選擇的游標(biāo)類型和游標(biāo)位置決定。ADO記錄集的本地存儲(chǔ)格式是ADTG文件格式(Advanced Data TableGram,高級(jí)數(shù)據(jù)表圖)。ADTG是一種Microsoft私有的二進(jìn)制存儲(chǔ)模式,代表著記錄集在內(nèi)存中的映像。XML是可替換使用的、確定的、詳細(xì)輸出格式。在ADO.NET中,我們可以斷開(kāi)一個(gè)記錄集集合的連接,通過(guò)一個(gè)默認(rèn)(但允許更改)的XML模式再現(xiàn)記錄集集合。
在ADO.NET對(duì)象模型中,DataSet(數(shù)據(jù)集)是最重要的對(duì)象。一般地,一個(gè)DataSet對(duì)象就是一個(gè)記錄集的集合。ADO.NET框架提供了記錄集的所有數(shù)據(jù)庫(kù)功能:排序,分頁(yè),過(guò)濾視圖,關(guān)系,索引,和主鍵。
DataSet對(duì)象代表了一個(gè)在內(nèi)存中的、有著豐富功能的數(shù)據(jù)緩沖區(qū)。DataSet對(duì)象也通過(guò)表組織數(shù)據(jù),這些表與原始的數(shù)據(jù)源之間不存在連接。我們可以添加表,表可以通過(guò)讀取本地或遠(yuǎn)程XML文件獲得,或者也可以從任何可訪問(wèn)的系統(tǒng)資源(包括內(nèi)存和其他附屬設(shè)備在內(nèi))讀取。我們可以排序、索引、過(guò)濾數(shù)據(jù)表,象處理ADO的Recordset一樣導(dǎo)航數(shù)據(jù)表。
我們可以通過(guò)命令用數(shù)據(jù)集合填充DataSet對(duì)象。如果用.NET集合的形式為DataSet對(duì)象提供數(shù)據(jù)表(具有集合功能的.NET數(shù)據(jù)類型是ICollection),同一個(gè)DataSet對(duì)象能夠服務(wù)來(lái)自多個(gè)連接的多個(gè)請(qǐng)求。ADO.NET的DataSet對(duì)象比ADO的Recordset更一般化;與ADO的Recordset不同,它是對(duì)數(shù)據(jù)源的一種抽象。然而,DataSet對(duì)象保留了一個(gè)在內(nèi)存中工作的數(shù)據(jù)存儲(chǔ)器;它沒(méi)有完全淘汰記錄集功能。如果我們只需要一次性地滾動(dòng)記錄集,然后生成某種輸出,那么,我們應(yīng)該使用DataReader對(duì)象。.NET的DataReader對(duì)象類似于“只能向前、只讀”的記錄集,但它是一個(gè)高度專用化的對(duì)象,所以無(wú)論在體積和開(kāi)銷上它都要比記錄集小。事實(shí)上,記錄集能夠執(zhí)行許多不同的任務(wù),是一個(gè)相當(dāng)臃腫的對(duì)象。與ADO的Recordset相比,DataReader不包含進(jìn)行“家務(wù)管理”的代碼,除了實(shí)現(xiàn)功能所必需的代碼之外,它不包含任何其他代碼。
把多個(gè)表作為一個(gè)整體管理以及允許建立這些表之間的關(guān)系,這是ADO.NET的新功能。我們可以用XML形式持久化或傳輸任何DataSet對(duì)象,而且無(wú)需付出任何額外的代價(jià),因?yàn)镈ataSet對(duì)象本身就是按照XML格式構(gòu)造。因此,除非要修改底層模式,否則,我們無(wú)需為了獲得一個(gè)XML流而去轉(zhuǎn)換DataSet對(duì)象的任意一個(gè)部分。
[1] [2] [3] 下一頁(yè)