Home [ADO.NET] DataSet、DataTable、DataReader、DataAdapter之間的差異
Post
Cancel

[ADO.NET] DataSet、DataTable、DataReader、DataAdapter之間的差異

1.四者各自的介紹

DataSet是用來做連接sql的一種方法,意思是把資料庫的副本存在應用程式裡,相當於存在記憶體中的資料庫,應用程式開始運行時,把資料庫相關資料存到DataSet.

DataTable表示記憶體中資料的一個表.常和DefaultView使用取得可能包括篩選視圖或遊標位置的表的自訂視圖。

DataReader物件是用來讀取資料庫最簡單的方式,它只能讀取,不能寫入,並且是從頭到尾往下讀的,無法只讀某條資料,但它佔用記憶體小,速度快

DataAdapter物件是用來讀取資料庫.可讀取寫入資料,某條資料超強,但它佔用記憶體比dataReader大,速度慢,一般和DataSet連用.

Dataset表示一個資料集,是資料在記憶體中的快取資料。可以包括多個表

DataSet 連接資料庫時是非面向連接的(離線操作)。把表格全部讀到Sql中的緩衝池,並斷開於資料庫的連接

DataReader 連接資料庫時是面向連線的(連線操作)。讀資料表時,只能向前讀取,讀完資料後由使用者決定是否斷開連線。

分散式系統的資料可能會用DataSet做資料載體,因為DataSet是保存資料的資料結構,而DataReader不承擔保存資料的責任,它只負責從資料來源讀取資料到本地而已,它不是資料結構,而是網路通訊組件的高層封裝。 DataAdapter也只是使用DataReader從資料源讀取資料並Add到AataSet保存起來而已。假如我們單獨使用DataReader也可以把資料寫入到業務類別或dataset裡。那隻是根據業務需要而選擇不同的資料載體而已。其實我們從資料庫取得資料都會透過DataReader,只不過DataAdapter把這一切都封裝起來了

2.DataSet 和 DataReader物件有什麼差別?

DataSet可以離線處理,前後捲動.DataReader不能離線處理,且是唯讀的向前的,不過速度明顯會很快 DataSet可以儲存資料庫各種物件的,例如表格觸發器等,而DataReader只能儲存遊標記錄

DataSet可以更新回原來的資料庫,DataReader不行;

DataSet可以FORWORD PREVIUS,而DataReader只能FW;

DataReader類似一個只能向前的游標記錄集

DataSet叫資料集!是ADO.net相對與ADO實現斷開式資料庫連線性的主要體現! DateReader是一個客戶端的只向前遊標,兩者的應用領域不同!讀取資料後!如果要進行比較頻繁的改動,可以使用DataSet,且DataSet也支援串行化,可與xslt結合!進行web開發!

DataReader則偏向快速讀取資料!針對數據量比較大的數據可能應用的更加頻繁點!

ADO.NET提供以下兩個對象,用於檢索關聯式資料並將其儲存在記憶體中:DataSet和DataReader。 DataSet提供一個記憶體中資料的關係表示形式,一整套包含一些表格的資料(這些資料表包含資料、對資料進行排序並約束資料),以及表格之間的關係。 DataReader提供一個來自資料庫的快速、僅向前、唯讀資料流。

當使用DataSet時,經常會利用DataAdapter(也可能是CommandBuilder)與資料來源進行互動。當使用DataSet時,也可以利用DataView對DataSet中的資料套用排序和篩選。也可以從DataSet繼承,建立強類型DataSet,用於將表格、行和列作為強類型物件屬性公開。

下列主題包含的資訊涉及:使用DataSet或DataReader的最佳時機、如何最佳化存取它們所包含資料、以及如何最佳化使用DataAdapter(包括CommandBuilder)和DataView的技巧。

3.DataSet與DataReader

當設計應用程式時,請考慮應用程式所需功能的等級,以確定使用DataSet或DataReader。

若要透過應用程式執行以下操作,就要使用DataSet:

在結果的多個離散表之間進行導航。

操作來自多個資料來源(例如,來自多個資料庫、一個XML檔案和一個電子表格的混合資料)的資料。

在各層之間交換資料或使用XML Web服務。與DataReader不同的是,DataSet能傳遞給遠端客戶端。

重複使用相同的記錄集合,以便透過快取獲得效能改善(例如排序、搜尋或篩選資料)。

每筆記錄都需要執行大量處理。對使用DataReader傳回的每一行進行擴充處理會延長服務於DataReader的連線的必要時間,這影響了效能。

使用XML操作對資料進行操作,例如可擴充樣式表語言轉換(XSLT轉換)或XPath查詢。

對於下列情況,請在應用程式中使用DataReader:

  • 不需要快取資料。
  • 要處理的結果集太大,記憶體中放不下。
  • 一旦需要以僅向前、只讀方式快速存取資料。

注填DataSet時,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的效能表現為節省了DataSet佔用記憶體和填入DataSet所需的循環。一般來說,此效能提升只是象徵性的,因此,設計決策應以所需功能為基礎。

我常聽到有人問這個問題:「在ASP.NET Web應用程式中我應該用DataReader類別還是DataSet類別呢?」在許多文章以及新聞群組的貼文中我常看到這樣的誤解,也就是認為DataReader( SqlDataReader或OleDbDataReader的縮寫)比DataSet好。有時候我也會看到相反的說法。事實上,Microsoft創建了這兩個資料存取類別是因為它們都是我們所需要的。每個類別都有其優點和不足,你可以根據應用環境來選擇用哪一個。

本文就兩者的選擇問題做了很清楚的敘述,可以讓你在運用ASP.NET時,在選擇DataReader類別或DataSet類別的方面得到一些指南。在基於客戶端的Windows Form應用程式環境下,這些規則可能會改變。我在做這些講述時,假設你已經用過DataReader和DataSet類別了,並對它們很熟悉。

運用DataReader類別

以下就是運用DataReader類別的理想條件:你讀取的資料必須是新的,所以每次需要資料的時候,你都必須從資料庫讀取。建立一個DataReader類別不會消耗很多內存,不過隨著負載的增加,DataSet上的效能也會很快地提高(參考資源中Visual Studio Magazine中的文章)。

你對每行數據的需求很簡單。該情況的最好的例子就是簡單地將DataReader綁定到一個Web控件,例如DataGrid或DropDownList。

你只需要從資料庫中以只向前的(forward-only) 、唯讀的形式來存取XML資料。在這種情況下,你可以用SQLCommand物件的ExcecuteXmlReader()方法來得到一個XmlReader類別(相當於XML版的DataReader)。這就需要一個運用FOR XML子句的SQL Server查詢,或是一個包含有效XML的ntext欄位。

你計劃對資料庫進行幾個重複的調用,來讀取一小塊資訊。在這種情況下,我們前面提到的效能數據會有更大的提升。

的確,使DataSet類別更強大的許多功能只適用於基於客戶端的Windows Form應用程序,例如在多個表之間建立關係的功能。在很多情況下,DataSet類別比DataReader類別更有優勢,而且在某些情況下,你根本就無法用DataReader類別。

運用DataSet類別

在下面的情況,你應該考慮運用DataSet類別: 你建構了一個Web service,它運用的資料是你作為回傳值讀取的資料。因為DataReader類別必須保持到資料庫的連接,所以它們不能被序列化到XML中,也不能被傳送給一個Web service的呼叫者。

你需要排序或篩選資料。在運用一個DataView物件(呈現為DataTable類別的DefaultView屬性,它包含一個DataSet類別)來排序或篩選資料前,我們先試著用SQL查詢(如WHERE和ORDER BY語句)來實作這些功能,並運用更輕量級、更快的DataReader類別。然而,有時侯用這種方法是不行的,或者當你需要多次地對資料進行排序或篩選時就不能用DataReader。

針對同一請求,你需要多次遍歷資料。你只能在DataReader中循環一次。如果你想將多個ServerControl類別綁定到同一個資料集,那麼選擇DataSet就更好。 DataReader類別不能被綁定到多個ServerControl類,因為它是只向前讀取的。在這種情況下,如果要使用DataReader,則必須從資料庫讀取兩次資料。

你需要儲存數據,而後續的頁面請求可能會用到的這些數據。如果資料只被請求它的專門的人使用,你可以將DataSet類別保存在一個Session變數中。如果資料可以被任何人訪問,那麼你可以將它保存在一個Application變數中,或保存在Cache中(我建議使用後一種方法,因為它支援時間期限和回調(callback))。因為DataReader類別必須一直打開對資料庫的連接,而且它一次只能保存一行數據,所以它們不能在跨頁面請求中被保存。

你需要對一個結果集的每個元素實現特殊的、耗時的功能。例如,如果你從一個資料庫讀取一列郵遞區號,並想透過呼叫一個Web service來得到每個地區的詳細的天氣狀況信息,那麼選擇DataSet就會更好。這是因為,當你在使用DataReader類別時,在關閉DataReader類別前,與資料庫的連線不會被釋放回連接池。在數千頁面請求之間潛在的一個很小的延時都會造成Web應用程式的很高的訪問量,從而消耗完可用的連接。相反,DataSet可以在前端讀取所有的數據,並且可以馬上關閉與資料庫的連接,將它返回到連接池,因此其它的頁面請求就可以用這個連接了。

你需要在一個兩維範例中載入並處理XML資料。 DataSet類別對於XML很有用,因為你可以將DataView用於XML,對根本的資料進行排序和篩選,就同處理一個資料庫結果集一樣。然而,需要注意的是在System.Xml名字空間中有很多類,你可以將它們用於更複雜的XML操作。

你的資料來源不是一個資料庫。雖然OleDbDataReader可以用於任何OLEDB資料提供者(可能指向一個資料庫,也可能不指向一個資料庫),但DataSet物件可以從一個XML檔案直接載入數據,並動態地解釋它的schema。 DataSet類別也可以將XML資料寫回一個資料流或一個檔案。

從上面的敘述我們就可以看到,DataSet類比DataReader類別有更多的功能,這可以讓你在更多的情況下運用它們。但這並不意味著你總是在用DataSet類別。你需要在ASP.NET中完成的相當大一部分的任務都屬於DataReader的範疇。

儘管如此,毫無疑問,從重要程度或複雜程度的角度來說,DataSet類別在許多ASP.NET Web應用程式中都扮演著很重要的角色。你可以透過明智的快取來最小化資料庫往返,從而降低DataSet類別的「效能損害」。 DataReader和DataSet都是一個成功的ASP.NET Web應用程式的重要的元件。重要的是,我們需要了解何時、在哪裡可以最好的使用它們。

https://www.cnblogs.com/webapi/archive/2012/03/24/2415186.html

This post is licensed under CC BY 4.0 by the author.