DataReader與DataSet有什么區(qū)別?
DataSet表示一個(gè)數(shù)據(jù)集,是數(shù)據(jù)在內(nèi)存中的緩存。 可以包括多個(gè)表
DataSet 連接數(shù)據(jù)庫時(shí)是非面向連接的。把表全部讀到Sql中的緩沖池,并斷開于數(shù)據(jù)庫的連接
DataReader 連接數(shù)據(jù)庫時(shí)是面向連接的。讀表時(shí),只能向前讀取,讀完數(shù)據(jù)后有用戶決定是否斷開連接。
分布式系統(tǒng)的數(shù)據(jù)可能會用dataset做數(shù)據(jù)載體,因?yàn)閐ataset是保存數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),而DataReader不承擔(dān)保存數(shù)據(jù)的責(zé)任,它只負(fù)責(zé)從數(shù)據(jù)源讀取數(shù)據(jù)到本地而已,它不是數(shù)據(jù)結(jié)構(gòu),而是網(wǎng)絡(luò)通訊組件的高層封裝。 DataAdapter也只是使用DataReader從數(shù)據(jù)源讀取數(shù)據(jù)并Add到dataset保存起來而已。假如我們單獨(dú)使用DataReader也可以把數(shù)據(jù)寫入到業(yè)務(wù)類或者dataset里。那只是根據(jù)業(yè)務(wù)需要而選擇不同的數(shù)據(jù)載體而已。實(shí)際上我們從數(shù)據(jù)庫獲得數(shù)據(jù)都會通過DataReader,只不過DataAdapter把這一切都封裝起來了
DataSet 和 DataReader對象有什么區(qū)別?
DataSet可以離線處理,前后滾動.DataReader不能離線處理,且是只讀的向前的,不過速度明顯會很快;
DataSet可以存儲數(shù)據(jù)庫各種對象的,比如表觸發(fā)器等,而DataReader只能存儲游標(biāo)記錄
DataSet可以更新回原來的數(shù)據(jù)庫,DataReader不行;
DataSet可以FORWORD PREVIUS,而DataReader只能FW;
DataReader類似一個(gè)只能向前的游標(biāo)記錄集
DataSet叫數(shù)據(jù)集!是ADO.net相對與ADO實(shí)現(xiàn)斷開式數(shù)據(jù)庫連接性的主要體現(xiàn)!DateReader是一個(gè)客戶端的只向前游標(biāo),兩者的應(yīng)用領(lǐng)域不同!讀取數(shù)據(jù)后!如果要進(jìn)行比較頻繁的改動,可以使用DataSet,并且DataSet也支持串行化,可與xslt結(jié)合!進(jìn)行web開發(fā)!
DataReader則偏向于快速讀取數(shù)據(jù)!針對數(shù)據(jù)量比較大的數(shù)據(jù)可能應(yīng)用的更加頻繁點(diǎn)!
ADO.NET提供以下兩個(gè)對象,用于檢索關(guān)系數(shù)據(jù)并將其存儲在內(nèi)存中:DataSet和DataReader。DataSet提供一個(gè)內(nèi)存中數(shù)據(jù)的關(guān)系表示形式,一整套包括一些表在內(nèi)的數(shù)據(jù)(這些表包含數(shù)據(jù)、對數(shù)據(jù)進(jìn)行排序并約束數(shù)據(jù)),以及表之間的關(guān)系。DataReader提供一個(gè)來自數(shù)據(jù)庫的快速、僅向前、只讀數(shù)據(jù)流。
當(dāng)使用DataSet時(shí),經(jīng)常會利用DataAdapter(也可能是CommandBuilder)與數(shù)據(jù)源進(jìn)行交互。當(dāng)使用DataSet時(shí),也可以利用DataView對DataSet中的數(shù)據(jù)應(yīng)用排序和篩選。也可以從DataSet繼承,創(chuàng)建強(qiáng)類型DataSet,用于將表、行和列作為強(qiáng)類型對象屬性公開。
下列主題包括的信息涉及:使用DataSet或DataReader的最佳時(shí)機(jī)、如何優(yōu)化訪問它們所包含數(shù)據(jù)、以及如何優(yōu)化使用DataAdapter(包括CommandBuilder)和DataView的技巧。
DataSet與DataReader
當(dāng)設(shè)計(jì)應(yīng)用程序時(shí),要考慮應(yīng)用程序所需功能的等級,以確定使用DataSet或者是DataReader。
要通過應(yīng)用程序執(zhí)行以下操作,就要使用DataSet:
r 在結(jié)果的多個(gè)離散表之間進(jìn)行導(dǎo)航。
r 操作來自多個(gè)數(shù)據(jù)源(例如,來自多個(gè)數(shù)據(jù)庫、一個(gè)XML文件和一個(gè)電子表格的混合數(shù)據(jù))的數(shù)據(jù)。
r 在各層之間交換數(shù)據(jù)或使用XML Web服務(wù)。與DataReader不同的是,DataSet能傳遞給遠(yuǎn)程客戶端。
r 重用同樣的記錄集合,以便通過緩存獲得性能改善(例如排序、搜索或篩選數(shù)據(jù))。
r 每條記錄都需要執(zhí)行大量處理。對使用DataReader返回的每一行進(jìn)行擴(kuò)展處理會延長服務(wù)于DataReader的連接的必要時(shí)間,這影響了性能。
r 使用XML操作對數(shù)據(jù)進(jìn)行操作,例如可擴(kuò)展樣式表語言轉(zhuǎn)換(XSLT轉(zhuǎn)換)或XPath查詢。
對于下列情況,要在應(yīng)用程序中使用DataReader:
r 不需要緩存數(shù)據(jù)。
r 要處理的結(jié)果集太大,內(nèi)存中放不下。
r 一旦需要以僅向前、只讀方式快速訪問數(shù)據(jù)。
注填充DataSet時(shí),DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表現(xiàn)為節(jié)省了DataSet占用內(nèi)存和填充DataSet需要的循環(huán)。一般來說,此性能提升只是象征性的,因此,設(shè)計(jì)決策應(yīng)以所需功能為基礎(chǔ)。
經(jīng)常聽到有人問這個(gè)問題:“在ASP.NET Web應(yīng)用程序中我應(yīng)該用DataReader類還是DataSet類呢?”在很多文章以及新聞組的貼子中我經(jīng)??吹竭@樣的誤解,即認(rèn)為DataReader(SqlDataReader或OleDbDataReader的縮寫)比DataSet好。有時(shí)候我也會看到相反的說法。事實(shí)上,Microsoft創(chuàng)建了這兩個(gè)數(shù)據(jù)存取類是因?yàn)樗鼈兌际俏覀兯枰?。每個(gè)類都有其優(yōu)點(diǎn)和不足,你可以根據(jù)應(yīng)用環(huán)境來選擇用哪一個(gè)。
本文就兩者的選擇問題做了很清楚的講述,可以讓你在運(yùn)用ASP.NET時(shí),在選擇DataReader類或DataSet類的方面得到一些指南。在基于客戶端的Windows Form應(yīng)用程序環(huán)境下,這些規(guī)則可能會改變。我在做這些講述時(shí),假設(shè)你已經(jīng)用過DataReader和DataSet類了,并對它們很熟悉。
運(yùn)用DataReader類
下面就是運(yùn)用DataReader類的理想條件:你讀取的數(shù)據(jù)必須是新的,所以在每次需要數(shù)據(jù)的時(shí)候,你都必須從數(shù)據(jù)庫讀取。創(chuàng)建一個(gè)DataReader類不會消耗很多內(nèi)存,不過隨著負(fù)荷的增加,DataSet上的性能也會很快地提高(參考資源中Visual Studio Magazine中的文章)。
你對每行數(shù)據(jù)的需求很簡單。該情況的最好的例子就是簡單地將DataReader綁定到一個(gè)Web控件,如DataGrid或DropDownList。
你只需要從數(shù)據(jù)庫中以只向前的(forward-only) 、只讀的形式來存取XML數(shù)據(jù)。在這種情況下,你可以用SQLCommand對象的ExcecuteXmlReader()方法來得到一個(gè)XmlReader類(相當(dāng)于XML版的DataReader)。這就需要一個(gè)運(yùn)用FOR XML子句的SQL Server查詢,或者一個(gè)包含有效XML的ntext字段。
你計(jì)劃對數(shù)據(jù)庫進(jìn)行幾個(gè)重復(fù)的調(diào)用,來讀取一小塊信息。在這種情況下,我們前面提到過的性能數(shù)據(jù)會有更大的提高。
的確,使DataSet類更強(qiáng)大的許多功能只適用于基于客戶端的Windows Form應(yīng)用程序,比如在多個(gè)表之間建立關(guān)系的功能。在很多情況下,DataSet類都比DataReader類更有優(yōu)勢,而且在有些情況下,你根本就不能用DataReader類。
運(yùn)用DataSet類
在下面的情況,你應(yīng)該考慮運(yùn)用DataSet類: 你構(gòu)建了一個(gè)Web service,它運(yùn)用的數(shù)據(jù)是你作為返回值讀取的數(shù)據(jù)。因?yàn)镈ataReader類必須保持到數(shù)據(jù)庫的連接,所以它們不能被序列化到XML中,也不能被發(fā)送給一個(gè)Web service的調(diào)用者。
你需要排序或篩選數(shù)據(jù)。在運(yùn)用一個(gè)DataView對象(呈現(xiàn)為DataTable類的DefaultView屬性,它包含一個(gè)DataSet類)來排序或篩選數(shù)據(jù)前,我們先試著用SQL查詢(如WHERE和ORDER BY語句)來實(shí)現(xiàn)這些功能,并運(yùn)用更輕量級、更快的DataReader類。然而,有時(shí)侯用這種方法是不行的,或者當(dāng)你需要多次地對數(shù)據(jù)進(jìn)行排序或篩選時(shí)就不能用DataReader。
針對同一請求,你需要多次遍歷數(shù)據(jù)。你只能在DataReader中循環(huán)一次。如果你想將多個(gè)ServerControl類綁定到同一個(gè)數(shù)據(jù)集,那么選擇DataSet就更好。DataReader類不能被綁定到多個(gè)ServerControl類,因?yàn)樗侵幌蚯白x取的。在這種情況下,如果要使用DataReader,必須從數(shù)據(jù)庫讀取兩次數(shù)據(jù)。
你需要存儲數(shù)據(jù),而后續(xù)的頁面請求可能會用到的這些數(shù)據(jù)。如果數(shù)據(jù)只被請求它的專門的人使用,你可以將DataSet類保存在一個(gè)Session變量中。如果數(shù)據(jù)可以被任何人訪問,那么你可以將它保存在一個(gè)Application變量中,或保存在Cache中(我建議使用后一種方法,因?yàn)樗С謺r(shí)間期限和回調(diào)(callback))。因?yàn)镈ataReader類必須一直打開對數(shù)據(jù)庫的連接,而且它一次只能保存一行數(shù)據(jù),所以它們不能在跨頁面請求中被保存。
你需要對一個(gè)結(jié)果集的每個(gè)元素實(shí)現(xiàn)特殊的、耗時(shí)的功能。例如,如果你從一個(gè)數(shù)據(jù)庫讀取一列郵政編碼,并想通過調(diào)用一個(gè)Web service來得到每個(gè)地區(qū)的詳細(xì)的天氣狀況信息,那么選擇DataSet就會更好。這是因?yàn)?,?dāng)你在用DataReader類時(shí),在關(guān)閉DataReader類前,與數(shù)據(jù)庫的連接不會被釋放回連接池。在數(shù)千頁面請求之間潛在的一個(gè)很小的延時(shí)都會造成Web應(yīng)用程序的很高的訪問量,從而就會消耗完可用的連接。相反,DataSet可以在前端讀取所有的數(shù)據(jù),并可以馬上關(guān)閉與數(shù)據(jù)庫的連接,將它返回到連接池,因此其它的頁面請求就可以用這個(gè)連接了。
你需要在一個(gè)兩維范例中加載并處理XML數(shù)據(jù)。DataSet類對于XML很有用,因?yàn)槟憧梢詫ataView用于XML,對根本的數(shù)據(jù)進(jìn)行排序和篩選,就同處理一個(gè)數(shù)據(jù)庫結(jié)果集一樣。然而,需要注意的是在System.Xml名字空間中有很多類,你可以將它們用于更復(fù)雜的XML操作。
你的數(shù)據(jù)源不是一個(gè)數(shù)據(jù)庫。雖然OleDbDataReader可以用于任何OLEDB數(shù)據(jù)提供者(可能指向一個(gè)數(shù)據(jù)庫,也可能不指向一個(gè)數(shù)據(jù)庫),但DataSet對象可以從一個(gè)XML文件直接加載數(shù)據(jù),并動態(tài)地解釋它的schema。DataSet類也可以將XML數(shù)據(jù)寫回一個(gè)數(shù)據(jù)流或一個(gè)文件。
從上面的講述我們就可以看到,DataSet類比DataReader類有更多的功能,這就可以讓你在更多的情況下運(yùn)用它們。但這并不意味著你總是在用DataSet類。你需要在ASP.NET中完成的相當(dāng)大一部分的任務(wù)都屬于DataReader的范疇。
盡管如此,毫無疑問,從重要程度或復(fù)雜程度的角度來說,DataSet類在很多ASP.NET Web應(yīng)用程序中都起著很重要的作用。你可以通過明智的緩存來最小化數(shù)據(jù)庫往返,從而降低DataSet類的“性能損害”。DataReader和DataSet都是一個(gè)成功的ASP.NET Web應(yīng)用程序的重要的部件。重要的是,我們需要了解何時(shí)、在哪里可以最好的使用它們。
來源:http://www.cnblogs.com/puke/archive/2007/07/24/829290.html