在ASP.NETWeb應用程式中我應該用DataReader類還是DataSet類
提供了兩個主要的類來讀取資料。通過本文我們可以學習如何在兩者之間進行選擇。
我經常聽到有人問這個問題:“在eb應用程式中我應該用DataReader類還是DataSet類呢?”在很多文章以及新聞組的貼子中我經常看到這樣的誤解,即認為DataReader(SqlDataReader或OleDbDataReader的縮寫)比DataSet好。有時候我也會看到相反的說法。事實上,Microsoft建立了這兩個資料存取類是因為它們都是我們所需要的。每個類都有其優點和不足,你可以根據應用環境來選擇用哪一個。
本文就兩者的選擇問題做了很清楚的講述,可以讓你在運用時,在選擇DataReader類或DataSet類的方面得到一些指南。在基於客戶端的WindowsForm應用程式環境下,這些規則可能會改變。我在做這些講述時,假設你已經用過DataReader和DataSet類了,並對它們很熟悉。
運用DataReader類
下面就是運用DataReader類的理想條件:你讀取的資料必須是新的,所以在每次需要資料的時候,你都必須從資料庫讀取。建立一個DataReader類不會消耗很多記憶體,不過隨著負荷的增加,DataSet上的效能也會很快地提高(參考資源中VisualStudioMagazine中的文章)。
你對每行資料的需求很簡單。該情況的最好的例子就是簡單地將DataReader繫結到一個Web控制元件,如DataGrid或DropDownList。
你只需要從資料庫中以只向前的(forward-only)、只讀的形式來存取XML資料。在這種情況下,你可以用SQLCommand物件的ExcecuteXmlReader()方法來得到一個XmlReader類(相當於XML版的DataReader)。這就需要一個運用FORXML子句的SQLServer查詢,或者一個包含有效XML的ntext欄位。
你計劃對資料庫進行幾個重複的呼叫,來讀取一小塊資訊。在這種情況下,我們前面提到過的效能資料會有更大的提高。的確,使DataSet類更強大的許多功能只適用於基於客戶端的WindowsForm應用程式,比如在多個表之間建立關係的功能。在很多情況下,DataSet類都比DataReader類更有優勢,而且在有些情況下,你根本就不能用DataReader類。
運用DataSet類
在下面的情況,你應該考慮運用DataSet類:你構建了一個Webservice,它運用的資料是你作為返回值讀取的資料。因為DataReader類必須保持到資料庫的連線,所以它們不能被序列化到XML中,也不能被髮送給一個Webservice的呼叫者。
你需要排序或篩選資料。在運用一個DataView物件(呈現為DataTable類的DefaultView屬性,它包含一個DataSet類)來排序或篩選資料前,我們先試著用SQL查詢(如WHERE和ORDERBY語句)來實現這些功能,並運用更輕量級、更快的DataReader類。然而,有時侯用這種方法是不行的,或者當你需要多次地對資料進行排序或篩選時就不能用DataReader。
針對同一請求,你需要多次遍歷資料。你只能在DataReader中迴圈一次。如果你想將多個ServerControl類繫結到同一個資料集,那麼選擇DataSet就更好。DataReader類不能被繫結到多個ServerControl類,因為它是隻向前讀取的。在這種情況下,如果要使用DataReader,必須從資料庫讀取兩次資料。
你需要儲存資料,而後續的頁面請求可能會用到的這些資料。如果資料只被請求它的專門的人使用,你可以將DataSet類儲存在一個Session變數中。如果資料可以被任何人訪問,那麼你可以將它儲存在一個Application變數中,或儲存在Cache中(我建議使用後一種方法,因為它支援時間期限和回撥(callback))。因為DataReader類必須一直開啟對資料庫的連線,而且它一次只能儲存一行資料,所以它們不能在跨頁面請求中被儲存。
你需要對一個結果集的每個元素實現特殊的、耗時的功能。例如,如果你從一個數據庫讀取一列郵政編碼,並想通過呼叫一個Webservice來得到每個地區的詳細的天氣狀況資訊,那麼選擇DataSet就會更好。這是因為,當你在用DataReader類時,在關閉DataReader類前,與資料庫的連線不會被釋放回連線池。在數千頁面請求之間潛在的一個很小的延時都會造成Web應用程式的'很高的訪問量,從而就會消耗完可用的連線。相反,DataSet可以在前端讀取所有的資料,並可以馬上關閉與資料庫的連線,將它返回到連線池,因此其它的頁面請求就可以用這個連線了。
你需要在一個兩維範例中載入並處理XML資料。DataSet類對於XML很有用,因為你可以將DataView用於XML,對根本的資料進行排序和篩選,就同處理一個數據庫結果集一樣。然而,需要注意的是在名字空間中有很多類,你可以將它們用於更復雜的XML操作。
你的資料來源不是一個數據庫。雖然OleDbDataReader可以用於任何OLEDB資料提供者(可能指向一個數據庫,也可能不指向一個數據庫),但DataSet物件可以從一個XML檔案直接載入資料,並動態地解釋它的schema。DataSet類也可以將XML資料寫回一個數據流或一個檔案。
從上面的講述我們就可以看到,DataSet類比DataReader類有更多的功能,這就可以讓你在更多的情況下運用它們。但這並不意味著你總是在用DataSet類。你需要在中完成的相當大一部分的任務都屬於DataReader的範疇。
儘管如此,毫無疑問,從重要程度或複雜程度的角度來說,DataSet類在很多eb應用程式中都起著很重要的作用。你可以通過明智的快取來最小化資料庫往返,從而降低DataSet類的“效能損害”。DataReader和DataSet都是一個成功的eb應用程式的重要的部件。重要的是,我們需要了解何時、在哪裡可以最好的使用它們。
-
ASP.NET新型的投票結果顯示方法
一個投票功能模組少不了檢視投票結果,用進度條顯示各個投票結果可以起到一目瞭然的效果。以下是我的方法,請大家不吝賜教:1:做一張圖片用於做進度條,只需要很小的一個圖片就可以了,如高20px,寬1px。2:在要顯示進度條的單元格中插入image控制元件,其imageUrl設定為已做好的...
-
JavaScript資料型別學習
ECMAscript中有5種簡單的資料型別,也被稱為基本資料型別:Undefined、Null、Boolean、Number和String。還有一種複雜的資料型別——Object。Undefined型別在使用var宣告變數但未對其進行初始化時,這個變數的值就是undefined。如:varnumber;e(number);//undefined如...
-
如何獲取PHP陣列的鍵與值呢
array_keys($array);//獲取陣列(字典)的所有鍵值,返回一個鍵值陣列。array_values($array)://獲取陣列的所有value值,飯回一個數組。<?php$json='{"a":1,"b":2,"c":3,"d":4,"e":5}';//註明:value不帶雙引號時,其值只能是數字。【!!!注意:大括號兩邊只能是單引號,...
-
javascript中setInterval的用法總結
javascript中的setInterval的函式主要是在製作動畫或其他間隔性渲染(操作)效果時,對操作方法按照一定時間間隔進行呼叫的函式。setInterval的表示式格式主要有:setInterval(fnname,time,par1,par2,);setInterval(obj,fnname,time,par1,par2,);第一種是最常見的表達...
相關文章
- US Farmers Want to End Cuba Trade Embargo美文欣賞
- 英語滿分作文:Reading-TheBestMeanstoAcquireknowledge
- A Letter to the Editor of a Newspaper英語四級作文
- 最新《Fate/Stay Night Unlimited Blade Works》經典名句
- 私家車的壞處The Disadvantages of Private Cars英語作文
- I want to be a headmaster優秀作文
- can be easily made to demonstrate英語作文
- JavaScript在Android的WebView中parseInt函式轉換不正確
- Advantages of Being a Teacher英語作文
- I want to be a headmaster英語作文