淺談ADO.NET與ADO!!
2024-07-10 13:03:10
供稿:網(wǎng)友
最近老是看到有網(wǎng)友問關(guān)于ado.net和ado的區(qū)別和好壞問題,想想自己在剛接觸.net時(shí)確實(shí)也有此疑問,現(xiàn)將我的一點(diǎn)理解和體會寫來,希望能對大家有點(diǎn)幫助! 其實(shí)大部分東西還是來自msdn!! ado 對于用本機(jī)代碼編寫的應(yīng)用程序,ado 為 ole db 數(shù)據(jù)提供程序提供基于 com 的應(yīng)用程序級別接口。與 ado.net 相似,ado 支持各種開發(fā)需要,包括使用與關(guān)系數(shù)據(jù)庫和其他存儲區(qū)中的數(shù)據(jù)的活連接來創(chuàng)建前端數(shù)據(jù)庫客戶端和中間層業(yè)務(wù)對象。而且,像 ado.net一樣,ado可構(gòu)建客戶端記錄集、使用松耦合記錄集、處理 ole db 的數(shù)據(jù)整形行集合。
ado還支持一些不通過 ado.net公開的行為,如可滾動的服務(wù)器端游標(biāo)。然而,因?yàn)榉?wù)器端游標(biāo)需要保存數(shù)據(jù)庫資源,所以使用它們可能會對應(yīng)用程序的性能和可縮放性產(chǎn)生極大的負(fù)面影響。為了通過防火墻傳輸 ado 記錄集,您需要配置防火墻以啟用 com 封送請求,并考慮相關(guān)的安全后果。com封送處理還將數(shù)據(jù)類型限制為com標(biāo)準(zhǔn)定義的那些數(shù)據(jù)類型。可選擇以 xml格式保持 ado 記錄集并傳輸 xml 文本。 ado.net 是重要的應(yīng)用程序級接口,用于在 microsoft .net 平臺中提供數(shù)據(jù)訪問服務(wù)。在 ado.net中,可以使用新的 .net framework 數(shù)據(jù)提供程序來訪問數(shù)據(jù)源。這些數(shù)據(jù)提供程序包括:
sql server .net framework 數(shù)據(jù)提供程序。 ole db .net framework 數(shù)據(jù)提供程序。 odbc .net framework 數(shù)據(jù)提供程序。 oracle .net framework 數(shù)據(jù)提供程序。 這些數(shù)據(jù)提供程序可以滿足各種開發(fā)要求,包括中間層業(yè)務(wù)對象(它們使用與關(guān)系數(shù)據(jù)庫和其他存儲區(qū)中的數(shù)據(jù)的活動連接)。
ado.net 是專為基于消息的 web應(yīng)用程序而設(shè)計(jì)的,同時(shí)還能為其他應(yīng)用程序結(jié)構(gòu)提供較好的功能。通過支持對數(shù)據(jù)的松耦合訪問,ado.net 減少了與數(shù)據(jù)庫的活動連接數(shù)目(即減少了多個(gè)用戶爭用數(shù)據(jù)庫服務(wù)器上的有限資源的可能性),從而實(shí)現(xiàn)了最大程度的數(shù)據(jù)共享。
ado.net 提供幾種數(shù)據(jù)訪問方法。在有些情況下,web 應(yīng)用程序或 xml web services 需要訪問多個(gè)源中的數(shù)據(jù),或者需要與其他應(yīng)用程序(包括本地和遠(yuǎn)程應(yīng)用程序)進(jìn)行互操作,或者可受益于保持和傳輸緩存結(jié)果,這時(shí)使用數(shù)據(jù)集將是一個(gè)明智的選擇。作為一種替換方法,ado.net 提供數(shù)據(jù)命令和數(shù)據(jù)讀取器以便與數(shù)據(jù)源直接通信。使用數(shù)據(jù)命令和數(shù)據(jù)讀取器直接進(jìn)行的數(shù)據(jù)庫操作包括:運(yùn)行查詢和存儲過程、創(chuàng)建數(shù)據(jù)庫對象、使用 ddl 命令直接更新和刪除。
ado.net 還通過對分布式 ado.net 應(yīng)用程序的基本對象“數(shù)據(jù)集”(dataset) 支持基于 xml 的持久性和傳輸格式,來實(shí)現(xiàn)最大程度的數(shù)據(jù)共享。數(shù)據(jù)集是一種關(guān)系數(shù)據(jù)結(jié)構(gòu),可使用 xml進(jìn)行讀取、寫入或序列化。ado.net 數(shù)據(jù)集使得生成要求應(yīng)用程序?qū)优c多個(gè) web站點(diǎn)之間進(jìn)行松耦合數(shù)據(jù)交換的應(yīng)用程序變得很方便。
因?yàn)閿?shù)據(jù)集被遠(yuǎn)程處理為 xml 形式,所以任何兩個(gè)組件都可共享數(shù)據(jù)并使用 xml 架構(gòu)來定義數(shù)據(jù)集的關(guān)系結(jié)構(gòu)。而且,因?yàn)閿?shù)據(jù)集的序列化格式是xml,所以dataset對象可輕松穿過防火墻,而不受任何限制。除了從xml加載數(shù)據(jù)以外,數(shù)據(jù)集還可用sql server中的數(shù)據(jù)以及通過 ole db公開的數(shù)據(jù)源中的數(shù)據(jù)來填充,并可保存對這些數(shù)據(jù)的更改。
數(shù)據(jù)集的一個(gè)主要特性是可用兩種方式訪問和操作本地?cái)?shù)據(jù)集內(nèi)的數(shù)據(jù):
作為關(guān)系數(shù)據(jù)庫中的表----數(shù)據(jù)集可以包含一個(gè)表或表的集合。數(shù)據(jù)集的一個(gè)重要特征是,它會跟蹤其所包含的表之間的關(guān)系,就好像它是內(nèi)存中的關(guān)系數(shù)據(jù)存儲區(qū)。 作為 xml(可擴(kuò)展標(biāo)記語言)結(jié)構(gòu)----數(shù)據(jù)集中的數(shù)據(jù)還可按照 xml數(shù)據(jù)的形式訪問。提供了完成以下操作的方法:以 xml 形式讀取和寫入數(shù)據(jù);以 xml 架構(gòu)形式讀取和寫入數(shù)據(jù)集的結(jié)構(gòu)。此外,為了允許進(jìn)行同步查看、查詢和修改 xml 形式的數(shù)據(jù),可將 xmldatadocument 與數(shù)據(jù)集相關(guān)聯(lián)。 選擇 ado.net 或 ado
ado.net 和 ado都具有以下特點(diǎn):易于編程;與語言無關(guān);實(shí)現(xiàn)過程簡單;使用最小網(wǎng)絡(luò)流量;應(yīng)用程序前端和數(shù)據(jù)源之間需要的層數(shù)很少。兩種方法都可提供高性能的數(shù)據(jù)訪問。
無論您選擇這兩種數(shù)據(jù)訪問技術(shù)中的哪一種,都會影響應(yīng)用程序的設(shè)計(jì)、擴(kuò)展性、互操作性、易于維護(hù)性以及其他許多方面。這些方面包括:
托管代碼 如果您的應(yīng)用程序是用托管代碼編寫的,并且基于公用語言運(yùn)行庫構(gòu)建,則應(yīng)使用 ado.net。如果是用 c++ 編寫非托管代碼(尤其是在維護(hù)現(xiàn)有的 ado應(yīng)用程序時(shí)),ado仍是一個(gè)不錯(cuò)的選擇。數(shù)據(jù)結(jié)構(gòu) ado.net 數(shù)據(jù)集可包含一個(gè)或多個(gè)表,并同時(shí)提供基于表的關(guān)系視圖和基于 xml 的視圖。數(shù)據(jù)集使用標(biāo)準(zhǔn)的公共語言運(yùn)行庫類型,這可簡化編程過程。 ado 記錄集是單個(gè)表,只能以記錄集形式訪問,并且不包含關(guān)系。ado 記錄集可以是多表 join 查詢的結(jié)果,但它仍只是單個(gè)結(jié)果表。如果希望 ado 具有多個(gè)表,必須擁有多個(gè) recordset 對象。由于其集成的關(guān)系結(jié)構(gòu),ado.net 數(shù)據(jù)集可提供更好的功能。
數(shù)據(jù)共享 ado.net 為組件間以及跨層的數(shù)據(jù)交換提供基礎(chǔ):數(shù)據(jù)集可以 xml 的形式在 inte-rnet上傳遞,并可通過防火墻。可以在您的應(yīng)用程序內(nèi)以關(guān)系表的形式查看數(shù)據(jù)集,而在其他一些應(yīng)用程序中以 xml數(shù)據(jù)結(jié)構(gòu)的形式查看同一數(shù)據(jù)集。數(shù)據(jù)集提供方便的雙向轉(zhuǎn)換:從數(shù)據(jù)集表到 xml 文檔,以及從 xml 文檔到數(shù)據(jù)集表。 如果使用 com 封送處理傳輸 ado 記錄集,目標(biāo)應(yīng)用程序必須編寫成使用記錄集數(shù)據(jù)結(jié)構(gòu)。與只讀取 xml 數(shù)據(jù)相比較,它所要求的編程難度更大。或者,可以將 ado 記錄集保持為 xml,這樣可以更方便地與其他應(yīng)用程序和服務(wù)共享數(shù)據(jù)。
可縮放性 ado.net 是縮放性最強(qiáng)的解決方案。ado.net從一開始就被設(shè)計(jì)為這樣一種數(shù)據(jù)訪問結(jié)構(gòu),即用來生成具有較低總擁有成本的可縮放 web應(yīng)用程序的最佳數(shù)據(jù)訪問結(jié)構(gòu)。如果您不需要可縮放性并且不用托管代碼編寫,則可繼續(xù)使用ado。游標(biāo)位置 應(yīng)用程序可以在以下兩個(gè)位置中的任一處建立結(jié)果集:在應(yīng)用程序進(jìn)程內(nèi)(客戶端游標(biāo))或數(shù)據(jù)存儲區(qū)進(jìn)程內(nèi)(服務(wù)器端游標(biāo))。對于任意類型的用戶與數(shù)據(jù)的即興交互,客戶端游標(biāo)通常是很好的選擇。客戶端游標(biāo)在ado.net 中由 dataset 對象支持,而在 ado 中則由 clientcursor recordset 對象支持。順序的、只讀服務(wù)器游標(biāo)在ado.net中由數(shù)據(jù)讀取器(如 sqldatareader 或 oledbdatareader對象)支持,而在 ado 中則由只進(jìn)/只讀 recordset對象支持。順序的、只讀游標(biāo)為從數(shù)據(jù)庫中讀出數(shù)據(jù)提供最快的方法。
可滾動、可更新的服務(wù)器端游標(biāo)在 ado中由可滾動、可更新的 recordset對象支持。應(yīng)謹(jǐn)慎使用服務(wù)器端游標(biāo)。通過服務(wù)器端游標(biāo)進(jìn)行的針對結(jié)果的非順序滾動和更新操作會保持鎖定并導(dǎo)致資源爭用,這將大大限制應(yīng)用程序的可縮放性。不使用可滾動、可更新的服務(wù)器端游標(biāo),而在服務(wù)器上對結(jié)果的過程處理使用存儲過程,應(yīng)用程序通常會獲益。
數(shù)據(jù)訪問連接 ado.net 和 ado 都支持到數(shù)據(jù)庫的顯式連接。在 ado.net中,開發(fā)人員可使用數(shù)據(jù)讀取器,同時(shí)基于當(dāng)前位置保持鎖定狀態(tài),并且在讀取數(shù)據(jù)前需要到數(shù)據(jù)庫的連續(xù)連接。或者,數(shù)據(jù)可放到數(shù)據(jù)集中。使用數(shù)據(jù)集時(shí),開發(fā)人員可進(jìn)行以下選擇:修改數(shù)據(jù)集中的數(shù)據(jù)時(shí)保持連接和事務(wù)處于打開狀態(tài);或者只在需要將數(shù)據(jù)填充到數(shù)據(jù)集并將更改更新回?cái)?shù)據(jù)庫時(shí)才打開連接并使用事務(wù)。當(dāng)正在傳輸、查看和修改數(shù)據(jù)集中的數(shù)據(jù)時(shí),關(guān)閉連接可為其他用戶釋放資源和鎖定。在 ado中,記錄集可在用戶通讀數(shù)據(jù)庫中的數(shù)據(jù)時(shí)使用打開的連接并保持鎖定,或者使用客戶端游標(biāo)記錄集,這樣可在不保留數(shù)據(jù)庫連接的情況下處理數(shù)據(jù)。 數(shù)據(jù)滾動 ado.net 和 ado 既可按順序?yàn)g覽數(shù)據(jù),也可不按順序?yàn)g覽數(shù)據(jù)。使用 ado.net數(shù)據(jù)集,還可以方便地從一個(gè)數(shù)據(jù)表中的一行瀏覽到另一個(gè)表中的相關(guān)行。ado記錄集和 ado.net 數(shù)據(jù)閱讀器都支持高速、只能向前、只讀的服務(wù)器端游標(biāo)。ado 記錄集唯一支持可滾動、可更新的服務(wù)器端游標(biāo),盡管這種游標(biāo)使用服務(wù)器資源,并且大多數(shù)情況下可以更好地以存儲過程中的邏輯的形式實(shí)現(xiàn),或者以松耦合的客戶端游標(biāo)的形式實(shí)現(xiàn)。 使用簡易 ado.net數(shù)據(jù)集提供自我描述的數(shù)據(jù),并免除了處理基礎(chǔ)數(shù)據(jù)構(gòu)造(如表、列、約束和行)的需要。相反,利用數(shù)據(jù)集,可使用對象對數(shù)據(jù)進(jìn)行類型安全的訪問。這使得程序更易讀、寫和修改。由于應(yīng)用程序?qū)涌梢酝ㄟ^ xml格式的數(shù)據(jù)集交換數(shù)據(jù),因此在應(yīng)用程序的生命周期中可以方便地實(shí)現(xiàn)新的擴(kuò)展通信。使用 ado.net時(shí),使用哪種語言進(jìn)行數(shù)據(jù)訪問無關(guān)緊要:它們在語法上都是類似的,并使用相同的公共語言運(yùn)行庫服務(wù)。 雖然 ado.net 和 ado 都支持松耦合的數(shù)據(jù)訪問,但二者存在差異。利用 ado.net,可通過修改dataadapter 對象使用的語句,或通過插入可響應(yīng)行更新事件的自定義代碼,來控制數(shù)據(jù)集更改傳輸?shù)綌?shù)據(jù)庫的方式。使用該功能可以優(yōu)化性能、修改驗(yàn)證檢查或添加其他任何額外處理,所有這些操作都不必更改您的應(yīng)用程序。有關(guān)更多信息,請參見 .net 應(yīng)用程序結(jié)構(gòu)中的問題。 ado與ado.net的比較----------------------------------------------------------項(xiàng)目 ado ado.net——————————————————————————————————————————————————————————數(shù)據(jù)更新 直接處理 類似批處理數(shù)據(jù)訪問速度 較慢 快(因?yàn)樵趦?nèi)存中)對于數(shù)據(jù)記錄的訪問 recordset dataset.tables(“數(shù)據(jù)表名稱“)數(shù)據(jù)搜索 recordset.find dataset.tables(“數(shù)據(jù)表名稱“).select數(shù)據(jù)遍歷 recordset.movenext mydataset.tables(“數(shù)據(jù)表名稱“).rows(i+=1)一個(gè)字段 recordset.fields(“字段名稱“) mydataset.tables(“數(shù)據(jù)表名稱“).rows(x,y)通用性 較難在主機(jī)間傳遞 可以轉(zhuǎn)成xml在網(wǎng)絡(luò)間傳遞(可越過防火墻)數(shù)據(jù)表達(dá) 較單純(僅view和table) 較完整(可包括多個(gè)數(shù)據(jù)表,以及其中的關(guān)聯(lián))系統(tǒng)資源 較浪費(fèi)(必須一直連接)