8.2 非連接的數(shù)據(jù)
到目前為止,你所見到的所有示例都使用了ADO.NET基于連接的特性。采用這種方式時(shí),只有數(shù)據(jù)讀取后數(shù)據(jù)才會(huì)和數(shù)據(jù)源斷開連接。代碼需要負(fù)責(zé)追蹤用戶活動(dòng)、保存信息并確定何時(shí)創(chuàng)建和執(zhí)行新的命令。
ADO.NET通過DataSet對(duì)象強(qiáng)調(diào)了另外一種完全不同的理念。連接數(shù)據(jù)庫時(shí),用從數(shù)據(jù)庫中獲得的信息的副本來填充DataSet。如果修改了DataSet中的信息,數(shù)據(jù)庫中相應(yīng)表的信息并不會(huì)隨之改變。也就是說,處理和操作數(shù)據(jù)時(shí)不用擔(dān)心正在使用的珍貴的數(shù)據(jù)庫連接。如果需要的話,還可以重新連接原來的數(shù)據(jù)源,通過一個(gè)批操作把DataSet中數(shù)據(jù)的修改應(yīng)用到表中。
當(dāng)然,這樣的便利并非沒有缺點(diǎn),比如并發(fā)性問題。根據(jù)應(yīng)用程序設(shè)計(jì)的不同,一批更新可以在一起提交。某項(xiàng)錯(cuò)誤(如試圖更新其他用戶正在更新的記錄)會(huì)使整個(gè)更新失敗。謹(jǐn)慎的編碼可以讓應(yīng)用程序遠(yuǎn)離這些問題--但是需要額外的付出。
有些時(shí)候,你會(huì)樂意使用ADO.NET的非連接模型以及DataSet。某些場(chǎng)景中DataSet比DataReader更便于使用,包括下面這些情形。
需要一個(gè)方便的包以便在組件間傳遞數(shù)據(jù)(例如,在組件間共享信息或者通過Web服務(wù)向客戶分發(fā)信息)。
需要一個(gè)方便的文件格式將數(shù)據(jù)串行化后保存到磁盤上(DataSet包含一個(gè)內(nèi)建的功能可以將自己保存到XML文件中)。
需要在大量的數(shù)據(jù)中前后瀏覽。例如,可以使用DataSet支持分頁的列表控件每次只顯示一部分信息。DataReader只能往一個(gè)方向移動(dòng),即向前移動(dòng)。
需要在不同的表間導(dǎo)航。DataSet可以保存所有這些表以及它們的關(guān)系。因此,使用DataSet可以創(chuàng)建一個(gè)主-從頁面而不需要多次到數(shù)據(jù)庫執(zhí)行查詢。
需要通過用戶界面控件綁定數(shù)據(jù)。你也可以使用DataReader進(jìn)行綁定,但因?yàn)樗俏ㄟM(jìn)的游標(biāo),所以它不可以同時(shí)綁定到多個(gè)控件上。同時(shí),它還不能像DataSet一樣對(duì)數(shù)據(jù)進(jìn)行自定義排序或按條件過濾。
需要以XML方式操作數(shù)據(jù)。
需要通過Web服務(wù)提供批量更新。例如,可以讓客戶端下載一個(gè)包含大量行的DataTable,客戶端做了多個(gè)修改后再向服務(wù)器提交。在這樣的場(chǎng)景中,Web服務(wù)可以通過一次操作就實(shí)現(xiàn)所有的更新(假設(shè)沒有沖突發(fā)生)。
在本章后面的幾節(jié)中,你將學(xué)習(xí)如何把獲取的數(shù)據(jù)放到DataSet中。你還將學(xué)習(xí)如何從多張表中獲取數(shù)據(jù),如何為這些在內(nèi)存中的表建立關(guān)系,如何排序和過濾數(shù)據(jù),如何查找特定記錄;不過我們不介紹如何使用DataSet來執(zhí)行更新,因?yàn)锳SP.NET模型有更好的控制命令的方法,這將在下一節(jié)介紹。
聯(lián)系客服