国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

為 ADO 程序員設(shè)計(jì)的 ADO.NET

2024-07-10 13:03:26
字體:
供稿:網(wǎng)友
摘要:本文討論如何以 ado.net 方式實(shí)現(xiàn)基本數(shù)據(jù)庫操作,以及何時(shí)使用 ado.net 代替 ado。

目錄
.net 中的數(shù)據(jù)訪問
讀取數(shù)據(jù)
dataset、datatable 和 recordset
轉(zhuǎn)換現(xiàn)有代碼
更新數(shù)據(jù)
xml 擴(kuò)展支持
總結(jié)

自若干年前推出開放式數(shù)據(jù)庫連接 (odbc) 應(yīng)用程序編程接口 (api) 以來,出現(xiàn)了各種各樣的數(shù)據(jù)庫訪問技術(shù),而 ado.net 是其中最新的一種。在這過程中,發(fā)生了許多有趣的事。例如,com 闖入數(shù)據(jù)庫領(lǐng)域,開始培植 ole db 的殖民進(jìn)程。然后,大致相當(dāng)于 ole db 自動(dòng)化版本的 activex® data objects (ado) 被選來統(tǒng)治 windows® 數(shù)據(jù)庫開發(fā)者的 visual basic® 和 asp 社區(qū)。

通過 .net,microsoft 正在提供通用框架(即 framework class library),其中將包括所有現(xiàn)有的 windows api 甚至更多的內(nèi)容。特別值得一提的是,它包括大量常用的庫,而這些庫現(xiàn)在需要通過各個(gè) com 對象分別獲得。在這些庫中,您會(huì)發(fā)現(xiàn) xml 和 ado 對象模型,它們被集成到了叫做 ado.net 的類子樹中。

ado.net 事實(shí)上成為構(gòu)建數(shù)據(jù)感知 .net 應(yīng)用程序的基礎(chǔ)。和 ado 不同的是,ado.net 遵循更通用的原則,不那么專門面向數(shù)據(jù)庫。ado.net 集合了所有允許數(shù)據(jù)處理的類。這些類表示具有典型數(shù)據(jù)庫功能(如索引、排序和視圖)的數(shù)據(jù)容器對象。盡管 ado.net 是 .net 數(shù)據(jù)庫應(yīng)用程序的權(quán)威解決方案,但從總體設(shè)計(jì)上來看,它不象 ado 模型那樣以數(shù)據(jù)庫為中心,這是 ado.net 的一大特點(diǎn)。

ado.net 與 ado 有很大差異。ado.net 是新的數(shù)據(jù)訪問編程模型,需要開發(fā)人員的全面理解、投入和新思維。然而,一旦開始掌握 ado.net,您將意識(shí)到:原有的 ado 技巧非常有助于您以不同、卻更巧妙和可靠的方式來創(chuàng)建有效的應(yīng)用程序和解決各種老問題。

在這篇文章的其余部分,我將集中介紹如何以 ado.net 方式實(shí)現(xiàn)基本的數(shù)據(jù)庫操作。我想說明,在什么時(shí)候 ado.net 是比 ado 更好的選擇,而您最好在什么時(shí)候應(yīng)放棄 ado。ado.net 并不是將 ado 改良以符合 .net 基礎(chǔ)結(jié)構(gòu)而形成的。只要您看一下 ado.net 的語法、代碼設(shè)計(jì)和移植,就會(huì)明白這一點(diǎn)。

.net 中的數(shù)據(jù)訪問
在 ado.net 中訪問數(shù)據(jù)源的方式由托管提供程序確定。從功能上講,托管提供程序與 ole db 的提供程序非常相似,但有兩個(gè)重要的不同之處。首先,管理提供程序在 .net 環(huán)境中工作,通過 datareader 和 datatable 等 .net 類檢索和公開數(shù)據(jù)。其次,因?yàn)樗鼈兊捏w系結(jié)構(gòu)針對 .net 進(jìn)行了優(yōu)化,所以比較簡單。

目前 ado.net 提供了兩種托管提供程序:一種用于 sql server™ 7.0 或更高版本,另一種用于其他所有您可能已經(jīng)安裝的 ole db 提供程序。在這兩種情況下您分別使用不同的類,但遵循相似的命名規(guī)則。除前綴外,名稱都是相同的。前一種情況前綴為 sql,后一種情況則是 ado。

您應(yīng)該使用 sql 類訪問 sql server 表,因?yàn)樗鼈冎苯舆M(jìn)入數(shù)據(jù)庫服務(wù)器的內(nèi)部 api,跳過了由 ole db 提供程序表示的中間層。ado 類是 ole db 提供程序上的 .net 接口,它們使用 com interop 橋進(jìn)行工作。

ado.net 對象的初學(xué)者可參閱 omri gazitt 的文章介紹 ado+:用于 microsoft .net 框架的數(shù)據(jù)訪問服務(wù)(英文)和我的 ado+ 推動(dòng)數(shù)據(jù)種類的演變(英文)一文。前者技術(shù)性較強(qiáng),針對 ado.net 程序模型提供了高水平的評(píng)注性概述。后者主要介紹 ado.net 的目標(biāo)和它與 xml、腳本以及其他技術(shù)之間的聯(lián)系。

讀取數(shù)據(jù)
需要從數(shù)據(jù)源中讀取數(shù)據(jù)的 ado.net 應(yīng)用程序首先要?jiǎng)?chuàng)建連接對象。根據(jù)目標(biāo)提供程序的不同,該連接對象可以是 sqlconnection 或 adoconnection。請記住,您可以使用 ado.net 類來連接到 sql server 數(shù)據(jù)庫,但我們不建議這樣做。其唯一的缺點(diǎn)是,您的代碼要通過不必要的額外代碼層。它先將 ado 的托管提供程序調(diào)入,然后托管提供程序再調(diào)用 sql server ole db 提供程序。而 sql server 托管提供程序和 ole db 提供程序一樣直接操作數(shù)據(jù)。

ado 和 ado.net 連接對象之間的顯著差異是:ado.net 連接不支持 cursorlocation 屬性。請注意,這并不是一個(gè)文檔錯(cuò)誤,而是一個(gè)有爭議的設(shè)計(jì)問題。為了突出以數(shù)據(jù)為中心的原則,ado.net 沒有游標(biāo)的顯式實(shí)現(xiàn)。

在 ado 中,您習(xí)慣了用游標(biāo)從數(shù)據(jù)庫或其他任何 ole db 兼容的數(shù)據(jù)源中抽取記錄。您可以選擇客戶端或服務(wù)器游標(biāo),每種游標(biāo)都有幾個(gè)預(yù)先設(shè)定的游標(biāo)類型。ado.net 則設(shè)計(jì)為從數(shù)據(jù)源中抽取數(shù)據(jù),并提供新的編程接口來讀取和分析數(shù)據(jù)。

在 ado 中,您通過指定連接和命令文本來創(chuàng)建 recordset 對象。對于游標(biāo)的位置和類型,recordset 有一定策略。您可以按下列方式之一讀取數(shù)據(jù):

在內(nèi)存中創(chuàng)建選定記錄的靜態(tài)副本,然后在從數(shù)據(jù)源斷開連接時(shí)根據(jù)需要處理這些記錄。ado 稱之為靜態(tài)游標(biāo)。


通過快速、僅向前的只讀游標(biāo)來滾動(dòng)數(shù)據(jù),這種游標(biāo)工作在記錄的靜態(tài)快照中。ado 稱之為只讀游標(biāo)。


通過服務(wù)器端的兩種游標(biāo)來訪問數(shù)據(jù),這些游標(biāo)需要保持良好的連接,但您可以在各個(gè)不同層次上隨時(shí)檢測其他已連接的用戶的更改。ado 稱它們?yōu)殒I集和動(dòng)態(tài)游標(biāo)。
前兩種方式都在斷開連接的記錄集內(nèi)工作,并從客戶端緩存讀取信息,這是它們的相似之處。另外,在面向 web 的環(huán)境中和對于新的 n 層系統(tǒng),這兩種方式被證明是使用頻率最高的。

在 ado 中,以上所有這些方式與不同類型的游標(biāo)相對應(yīng)。您將在本文后面發(fā)現(xiàn),雖然 ado.net 有很大不同,但它能實(shí)現(xiàn)您用 ado 可實(shí)現(xiàn)的任何功能。只不過您的代碼將從實(shí)際數(shù)據(jù)源及其物理存儲(chǔ)媒介和格式中抽取數(shù)據(jù)。

ado.net 提供兩個(gè)對象來處理從數(shù)據(jù)源中抽取的數(shù)據(jù)。它們是 dataset 和 datareader 對象。前者是記錄在內(nèi)存中的緩存,您可以從任何方向隨意訪問和修改。后者是高度優(yōu)化的對象,專為以僅向前方式滾動(dòng)只讀記錄而設(shè)計(jì)。請注意 dataset 看起來象靜態(tài)游標(biāo),但實(shí)際上,在 .net 中與 ado 只讀游標(biāo)相對應(yīng)的是 datareader 對象。

在 ado.net 中,不支持服務(wù)器端游標(biāo)。然而,這不意味著您不能使用游標(biāo)。您需要做的是在 .net 中導(dǎo)入 ado 類型庫。在項(xiàng)目窗口的 references 節(jié)點(diǎn)上單擊右鍵就行了。導(dǎo)入之后,您便可以開始在應(yīng)用程序中使用本地 ado 對象了。

盡管我承認(rèn)下決心轉(zhuǎn)向 .net 是一件很難的事情,但我個(gè)人還是建議您考慮用 .net 重寫現(xiàn)有應(yīng)用程序。可以把完全導(dǎo)入 ado 作為邁向 .net 的第一步,這無須投入太多的時(shí)間和資源。然而,請記住這只是漫漫長路上的第一步。這絕不是您邁向 .net 的唯一一步。.net 具有超值價(jià)值的的真正原因在于統(tǒng)一和一致的編程接口以及對本地類的廣泛使用。您可以導(dǎo)入 com 類型庫,但導(dǎo)入 com 類型庫只能作為臨時(shí)解決方案或者中間步驟,我們并不鼓勵(lì)這樣做。

使用 ado.net 時(shí),應(yīng)當(dāng)充分考慮到它統(tǒng)一了數(shù)據(jù)容器類編程接口這一事實(shí)。無論您打算編寫何種應(yīng)用程序,windows 窗體、web 窗體還是 web 服務(wù),都可以通過同一組類來處理數(shù)據(jù)。不管在后端的數(shù)據(jù)源是 sql server 數(shù)據(jù)庫、ole db、xml 文件還是一個(gè)數(shù)組,您都可以通過相同的方法和屬性來滾動(dòng)和處理它們的內(nèi)容。



圖 1:solution explorer 菜單

如果您堅(jiān)持在 .net 中使用 ado,請準(zhǔn)備面對一些副作用。例如,您需要額外的代碼才能夠從數(shù)據(jù)綁定控件中使用記錄集。

dataset、datatable 和 recordset
在 ado.net 中,沒有與 recordset 對象直接對應(yīng)的對象。最接近的是 datatable 對象。盡管這兩個(gè)對象的功能幾乎一樣,但它們在各自的框架中起不同的作用。

recordset 是一個(gè)大型對象,具有許多 ado 功能,但還是有所欠缺。recordset 在很多方面性能優(yōu)良,例如可創(chuàng)建性、斷開連接時(shí)仍能工作、功能豐富等等。但是,在某些方面仍然有待提高。例如,由于 recordset 固有的 com 特性,通過網(wǎng)絡(luò)進(jìn)行序列化的工作將非常繁重。又如它是二進(jìn)制對象,所以在不同的平臺(tái)上運(yùn)行的模塊很難共享它,而且它不能穿過防火墻。另外,recordset 表示多個(gè)記錄的單個(gè)表。如果該表是由一個(gè)或多個(gè) join 產(chǎn)生的,更新原始數(shù)據(jù)源可能會(huì)很困難。如果您要使斷開連接的記錄集和原始數(shù)據(jù)源保持協(xié)調(diào),數(shù)據(jù)源必須能夠識(shí)別 sql。然而,您的記錄集很可能是通過非 sql 提供程序創(chuàng)建的。

在 ado.net 中,ado recordset 的所有功能被拆分成幾個(gè)較簡單的對象,datareader 就是其中之一。datareader 模擬快速、僅向前的只讀游標(biāo)的操作。

datatable 是一個(gè)表示數(shù)據(jù)源的簡單對象。您可以手動(dòng)構(gòu)造 datatable,也可以通過 dataset 命令自動(dòng)填充它。datatable 不區(qū)分它所包含的數(shù)據(jù)的來源。該對象允許您在內(nèi)存中處理數(shù)據(jù),以及執(zhí)行瀏覽、排序、編輯、應(yīng)用篩選器、創(chuàng)建視圖等操作。

ado 中沒有與 dataset 相對應(yīng)的對象。dataset 對象是一個(gè)容器類,是實(shí)現(xiàn) ado.net 數(shù)據(jù)抽取的關(guān)鍵對象。dataset 將一個(gè)或多個(gè) datatable 對象分組。datatable 通過象行和列這樣的通用集合公開它的內(nèi)容。當(dāng)您嘗試從數(shù)據(jù)表中讀取數(shù)據(jù)時(shí),您可能會(huì)經(jīng)過兩個(gè)不同的對象層:datatablemapping 和 dataview。

datatablemapping 對象描述了數(shù)據(jù)源中的數(shù)據(jù)列和 datatable 對象之間的映射關(guān)系。當(dāng)填充 dataset 時(shí),datasetcommand 對象要使用這個(gè)類。它維護(hù)數(shù)據(jù)集中的抽象列和數(shù)據(jù)源中的物理列之間的鏈接。

表的視圖通過 dataview 對象實(shí)現(xiàn)。它表示 datatable 的自定義視圖,可以綁定到特定控件(如 windows 窗體和 web 窗體中的數(shù)據(jù)網(wǎng)格)中。該對象相當(dāng)于 sql create view 語句在內(nèi)存中的實(shí)現(xiàn)。

dataset 中的所有表都可以通過一個(gè)公用域放入關(guān)系中。這個(gè)關(guān)系由 datarelation 對象管理。這看起來很象 ado 的數(shù)據(jù)形成,但有一點(diǎn)重要區(qū)別。您不需要使用數(shù)據(jù)形成語言,您最終會(huì)擁有一個(gè)非常靈活的結(jié)構(gòu)體系。ado.net 導(dǎo)航模型使您可以輕而易舉地從某一張表內(nèi)的主行移入它的所有子行。

datarelation 對象相當(dāng)于 join 語句在內(nèi)存中的實(shí)現(xiàn),可用于建立數(shù)據(jù)類型相同的列的父/子關(guān)系。一旦建立了關(guān)系,就不允許出現(xiàn)任何會(huì)破壞這種關(guān)系的更改,如果出現(xiàn)就會(huì)導(dǎo)致運(yùn)行時(shí)異常。視圖和關(guān)系是實(shí)現(xiàn)主表/明細(xì)表架構(gòu)的兩種方式。要記住,視圖只是放在記錄上的掩碼,而關(guān)系是設(shè)置在兩個(gè)表的一個(gè)或多個(gè)列之間的動(dòng)態(tài)鏈接。如果使用關(guān)系,您不能更改順序或設(shè)置條件。

如果您的代碼需要一對一外鍵關(guān)系,并且不更改數(shù)據(jù),那么您最好不要使用無格式的 join 命令。如果您需要額外的篩選功能,就應(yīng)該使用 ado.net 自定義視圖。

轉(zhuǎn)換現(xiàn)有代碼
有許多 asp 頁面使用 ado 對象來抽取數(shù)據(jù)。讓我們來討論幾種典型的情況,您在不久的將來移植和改編代碼時(shí)可能會(huì)遇上這些情形。

如果您有從單個(gè)記錄集生成報(bào)表的 asp 頁面,datareader 對象將是您最好的伙伴。
您瀏覽 datareader 對象時(shí),它會(huì)將結(jié)果輸出到頁面。

string strconn, strcmd;
strconn = "database=myagenda;server=localhost;uid=sa;pwd=;";
strcmd = "select * from names where id=" + contactid.text;
sqlconnection ocn = new sqlconnection(strconn);
sqlcommand ocmd = new sqlcommand(strcmd, ocn);
ocn.open();
sqldatareader dr;
ocmd.execute(out dr);
while (dr.read()) {
// 使用 dr.getstring(index) 或
// dr["field name"] 的方法 response.write 來輸出數(shù)據(jù)
}

您還可以用 hasmorerows 屬性快速檢查 datareader 是否為空。如果您只需要快速瀏覽一系列記錄,沒有比 datareader 更好更快的對象了。它同樣適用于查詢單個(gè)記錄。您不能編輯 datareader 的內(nèi)容,但您可以將其內(nèi)容移入更易于管理的對象,例如 datatable 或者一個(gè)或多個(gè) datarow 對象。

當(dāng)您需要處理表和記錄之間的復(fù)雜關(guān)系時(shí),datareader 就不再是合適的工具了。在 ado 中, 最終您需要處理記錄集。您的數(shù)據(jù)模型鏈接越多,sql 命令就越復(fù)雜。導(dǎo)航模型仍然是順序的,最后放入緩存的數(shù)據(jù)往往多于你所需要的。dataset 和 datarelation 對象是這種表關(guān)系模型的基礎(chǔ)。

為了管理父/子關(guān)系,ado 還封裝了數(shù)據(jù)形成引擎。從功能上講,數(shù)據(jù)形成和 ado.net 關(guān)系是一樣的。然而,從設(shè)計(jì)方面來看,它們幾乎沒有什么共同點(diǎn)。形成記錄集將所有信息嵌入單個(gè)列表對象。ado.net 關(guān)系是您可以隨時(shí)在兩個(gè)數(shù)據(jù)表之間建立的動(dòng)態(tài)鏈接。為了在執(zhí)行單個(gè) ado 命令的過程中創(chuàng)建一個(gè)層次結(jié)構(gòu)記錄集,ado 要依靠 shaping ole db 服務(wù)提供程序,并且使用特定的類 sql 語言。

在 ado.net 中,關(guān)系中涉及的每個(gè)對象總是被看成單獨(dú)的個(gè)體。關(guān)系本身作為對象被公開,并且具有一定的行為規(guī)則。例如,datarelation 對象可以從父行到子行一層層進(jìn)行更改。您可以通過將 foreignkeyconstraint 對象添加到 datatable 的 constraints 集合中來進(jìn)行此操作。foreignkeyconstraint 對象表示當(dāng)刪除或更新數(shù)值和行時(shí),對通過外鍵關(guān)系相關(guān)聯(lián)的一組列的約束。如前面提到的,一旦設(shè)置好了關(guān)系,在它按程序預(yù)設(shè)終止之前,您不能進(jìn)行可能破壞該關(guān)系的更改。

另外,關(guān)系是不可傳遞的。您可以建立兩組不同的關(guān)系,例如客戶和訂單、訂單和產(chǎn)品之間的關(guān)系。然而,當(dāng)在訂單中導(dǎo)航以尋找某一位客戶時(shí),您不能從一個(gè)訂單跳到與之相關(guān)的產(chǎn)品行。您必須另外打開訂單/產(chǎn)品關(guān)系,定位到您需要的訂單,然后才能獲取相關(guān)的行。這就是為什么有時(shí)候最好不要通過原來的無格式 sql join 語句實(shí)現(xiàn)一對一關(guān)系的原因。

需要在 asp session 對象中存儲(chǔ)記錄嗎?利用 ado.net 和 dataset 對象,您可以相當(dāng)安全的操作而不會(huì)導(dǎo)致在在 git 中存儲(chǔ) ado 記錄集可能會(huì)導(dǎo)致訪問沖突(英文)中所討論的問題,也不會(huì)有線程相似性的麻煩。

更新數(shù)據(jù)
更新數(shù)據(jù)時(shí),web 應(yīng)用程序通常使用無格式 sql 語句,或者使用更好的參數(shù)化存儲(chǔ)過程。然而,當(dāng)需要使用未連接的數(shù)據(jù)時(shí),您可能想使用內(nèi)置服務(wù)來更新所有需要修訂的記錄。ado 提供了批更新機(jī)制來實(shí)現(xiàn)這個(gè)功能。

updatebatch 方法用于把保存在副本緩沖中的 recordset 更改發(fā)送到服務(wù)器,以更新數(shù)據(jù)源。它采用開放式鎖定,允許所有掛起的本地更改。它還在單個(gè)操作中把所有更改傳送到數(shù)據(jù)源。僅當(dāng)更改提交后數(shù)據(jù)源鎖定要更改的記錄時(shí),才會(huì)出現(xiàn)開放式鎖定。開放式鎖定使兩個(gè)用戶可以同時(shí)訪問同一個(gè)記錄,但一個(gè)用戶輸入的更改很快會(huì)被另一用戶所覆蓋。當(dāng)然,這種方式要求數(shù)據(jù)源能夠檢測和防止數(shù)據(jù)沖突。還要求整個(gè)數(shù)據(jù)源比較穩(wěn)定,不會(huì)發(fā)生頻繁的更改。否則,不難想象協(xié)調(diào)費(fèi)用將很快超過替代嚴(yán)格鎖定所帶來的節(jié)約。事實(shí)上,使用 updatebatch 方法,在任何更改失敗時(shí)都會(huì)返回一個(gè)錯(cuò)誤。然后,您可以通過 errors 集合和 error 對象來訪問該錯(cuò)誤。

要理解 ado.net 模型為什么是更新數(shù)據(jù)的更強(qiáng)大的工具,理解 ado 中開放式鎖定的工作原理是非常關(guān)鍵的。在 ado 代碼中,您無法控制調(diào)用 updatebatch 之后所發(fā)生的一切。也就是說,更新是在服務(wù)器上通過滾動(dòng)已更改的行,然后比較原始值和數(shù)據(jù)源中對應(yīng)記錄中的當(dāng)前值來進(jìn)行的。當(dāng)所有的值都一致了,才對表執(zhí)行適當(dāng)?shù)?sql 語句(insert、update 或 delete)。

問題在于您不能控制實(shí)際應(yīng)用于更改的 sql 語句。服務(wù)器端的更新代碼并不比您編寫的代碼好,如果您采用非 sql 提供程序,它甚至無法運(yùn)行。在本節(jié)的開頭,我曾講過 web 應(yīng)用程序通常通過參數(shù)化存儲(chǔ)過程來更新數(shù)據(jù)。然而,如果您使用批更新就不同了。

在 ado.net 中,這個(gè)模型已經(jīng)有所擴(kuò)展。現(xiàn)在它采用更通用的架構(gòu),允許您自己指定基本操作命令,例如插入、刪除、更新和選擇等。其用意很明顯:不論何種數(shù)據(jù)源,都可以從中抽取數(shù)據(jù)并提供同樣的支持。在 ado.net 中進(jìn)行批更新,您需要?jiǎng)?chuàng)建 datasetcommand 對象即 sqldatasetcommand 或 adodatasetcommand。

注意:在 beta 2 中,datasetcommand 對象將被稱為 dataadapter 對象。

擁有 datasetcommand 對象之后,您便可以調(diào)用它的 update 方法。datasetcommand 提供 insertcommand、deletecommand、updatecommand 和 selectcommand 等屬性。它們都是 command 對象。但是,除非默認(rèn)行為無法滿足需要,否則您不必設(shè)置它們。這與在 ado 中一樣。在 update 過程中,如果沒有設(shè)置任何 xxxcommand 屬性,但是存在主鍵信息,將自動(dòng)生成 command 對象。請注意,要使上述過程正確進(jìn)行,必須為所涉及的數(shù)據(jù)表設(shè)置主鍵。

以下代碼顯示了如何為 dataset 的 employeeslist 表設(shè)置主鍵:

datacolumn[] keys = new datacolumn[1];
keys[0] = m_ods.tables["employeeslist"].columns["employeeid"];
m_ods.tables["employeeslist"].primarykey = keys;

主鍵基本上是 datacolumn 對象的一個(gè)數(shù)組。

如果您要使用存儲(chǔ)過程來更新表,或者采用專用非 sql 數(shù)據(jù)提供程序,您會(huì)經(jīng)常用到這些命令屬性。

xml 擴(kuò)展支持
在 ado 中,xml 只不過是輸入和輸出格式。然而在 ado.net 中,xml 是一種數(shù)據(jù)格式,提供了操作、組織、共享和傳遞數(shù)據(jù)的手段。任何帶入 dataset 的數(shù)據(jù),無論其來源,都能通過雙面編程模型進(jìn)行處理。您可以順序交替訪問信息,或者按行訪問,也可以按照 xml 文檔對象模型驅(qū)動(dòng)的非順序、層次結(jié)構(gòu)路徑進(jìn)行訪問。

dataset 將數(shù)據(jù)和架構(gòu)作為 xml 文檔進(jìn)行讀寫。數(shù)據(jù)和架構(gòu)都可以通過 http 傳輸,并且能在所有支持 xml 的平臺(tái)上使用。相同的數(shù)據(jù)在不同的時(shí)候可以通過不同的架構(gòu)來呈現(xiàn),這是通過 xslt 實(shí)現(xiàn)的。您可以使用 readxmlschema 方法編寫架構(gòu)。xml 架構(gòu)包括數(shù)據(jù)集中的表的說明,以及表的關(guān)系和約束。在調(diào)用 readxmldata 方法填充 dataset 之前,應(yīng)該先完成這個(gè)步驟。

以下代碼示例是一個(gè)顯示可更新數(shù)據(jù)表的最簡單的 asp.net 頁面。

<%@ import namespace="system.data" %>
<%@ import namespace="system.io" %>

<script runat="server" language="c#">
void page_load(object source, eventargs e)
{
   dataset data = new dataset();
   
   // 加載 xml 數(shù)據(jù)和架構(gòu)
   streamreader sr;
   sr = new streamreader(server.mappath("data.xml"));
   data.readxml(sr);
   sr.close();
   
   // 添加通過 url 傳遞的新記錄
   if (request.querystring.count >0)
   {
      datatable dt = data.tables[0];
      datarow dr = dt.newrow();
      dr["firstname"] = request.querystring["first"];
      dr["lastname"] = request.querystring["last"];
      dt.rows.add(dr);
      dt.acceptchanges();
      
      streamwriter sw;
      sw = new streamwriter(server.mappath("data.xml"));
      data.writexml(sw);
      sw.close();
   }

      // 刷新 ui(由網(wǎng)格組成)
   grid.datasource = data.tables[0].defaultview;
   grid.databind();
}
</script>

如圖 2 所示,您可以將新的行添加到表中。然而,它不涉及 sql server 或 access 表。它只是一個(gè) xml 文件,在處理它的代碼中,沒有使用 xml 節(jié)點(diǎn)或 xmldom 方法。您可以用相同的直觀數(shù)據(jù)表接口來讀取和更新 xml 記錄。您的工作方式與在 ado 中大致相同,但此處的模型更深入、更龐大,有更多的潛力供您去發(fā)掘。



圖 2:可更新表的示例

總結(jié)
web 應(yīng)用程序的成功改變了典型分布式系統(tǒng)的面貌。現(xiàn)在大多數(shù)分布式系統(tǒng)都是 n 層系統(tǒng),這類系統(tǒng)對擴(kuò)展性和互操作性的要求越來越高。因此,非連接數(shù)據(jù)處理和 xml 成為最佳實(shí)踐,并為業(yè)界廣為接受。  

ado.net 嘗試將當(dāng)今一些最好的實(shí)踐統(tǒng)一在 .net 下。這種用于數(shù)據(jù)訪問的編程模型全面而又非常強(qiáng)大。但這個(gè)模型可能尚不能滿足每一個(gè)人的要求,在將來的模型設(shè)計(jì)中還需要邁出一大步。然而,請記住現(xiàn)在 ado.net 還只是 beta 版,只有有限的文檔支持。

ado 程序員從 beta 版中獲益最多,因?yàn)樗麄兪煜ち?ado.net 的許多方面,包括最高層次的抽象即啟發(fā)性模型。ado.net 代碼與現(xiàn)有的 ado 代碼不兼容,但功能相似。要充分利用 ado.net,您應(yīng)該花些功夫來理解概念本身,而不僅僅是找出移植代碼的最快方式。無論您選擇何種 .net 編程模型,windows 窗體、web 窗體還是 web 服務(wù),ado.net 都會(huì)幫助您處理好數(shù)據(jù)訪問的問題。

 
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 钦州市| 建瓯市| 罗平县| 蓝山县| 阿拉善左旗| 扬中市| 武宣县| 河东区| 怀柔区| 博客| 湘潭县| 四平市| 海伦市| 武胜县| 汪清县| 梁山县| 五原县| 济源市| 栾川县| 商城县| 东安县| 额尔古纳市| 柳州市| 湟源县| 阿勒泰市| 盐源县| 肥西县| 徐闻县| 高邮市| 丘北县| 锡林郭勒盟| 静宁县| 邵阳县| 神木县| 陈巴尔虎旗| 湖北省| 新乡市| 隆化县| 绥江县| 永安市| 河津市|