經(jīng)常聽到有人問這個問題:“在asp.net web應(yīng)用程序中我應(yīng)該用datareader類還是dataset類呢?”在很多文章以及新聞組的貼子中我經(jīng)常看到這樣的誤解,即認(rèn)為datareader(sqldatareader或oledbdatareader的縮寫)比dataset好。有時候我也會看到相反的說法。事實上,microsoft創(chuàng)建了這兩個數(shù)據(jù)存取類是因為它們都是我們所需要的。每個類都有其優(yōu)點和不足,你可以根據(jù)應(yīng)用環(huán)境來選擇用哪一個。
本文就兩者的選擇問題做了很清楚的講述,可以讓你在運用asp.net時,在選擇datareader類或dataset類的方面得到一些指南。在基于客戶端的windows form應(yīng)用程序環(huán)境下,這些規(guī)則可能會改變。我在做這些講述時,假設(shè)你已經(jīng)用過datareader和dataset類了,并對它們很熟悉。
運用datareader類
下面就是運用datareader類的理想條件: 你讀取的數(shù)據(jù)必須是新的,所以在每次需要數(shù)據(jù)的時候,你都必須從數(shù)據(jù)庫讀取。創(chuàng)建一個datareader類不會消耗很多內(nèi)存,不過隨著負(fù)荷的增加,dataset上的性能也會很快地提高(參考資源中visual studio magazine中的文章)。
你對每行數(shù)據(jù)的需求很簡單。該情況的最好的例子就是簡單地將datareader綁定到一個web控件,如datagrid或dropdownlist。
你只需要從數(shù)據(jù)庫中以只向前的(forward-only) 、只讀的形式來存取xml數(shù)據(jù)。在這種情況下,你可以用sqlcommand對象的excecutexmlreader()方法來得到一個xmlreader類(相當(dāng)于xml版的datareader)。這就需要一個運用for xml子句的sql server查詢,或者一個包含有效xml的ntext字段。
你計劃對數(shù)據(jù)庫進(jìn)行幾個重復(fù)的調(diào)用,來讀取一小塊信息。在這種情況下,我們前面提到過的性能數(shù)據(jù)會有更大的提高。
的確,使dataset類更強大的許多功能只適用于基于客戶端的windows form應(yīng)用程序,比如在多個表之間建立關(guān)系的功能。在很多情況下,dataset類都比datareader類更有優(yōu)勢,而且在有些情況下,你根本就不能用datareader類。
運用dataset類
在下面的情況,你應(yīng)該考慮運用dataset類: 你構(gòu)建了一個web service,它運用的數(shù)據(jù)是你作為返回值讀取的數(shù)據(jù)。因為datareader類必須保持到數(shù)據(jù)庫的連接,所以它們不能被序列化到xml中,也不能被發(fā)送給一個web service的調(diào)用者。
你需要排序或篩選數(shù)據(jù)。在運用一個dataview對象(呈現(xiàn)為datatable類的defaultview屬性,它包含一個dataset類)來排序或篩選數(shù)據(jù)前,我們先試著用sql查詢(如where和order by語句)來實現(xiàn)這些功能,并運用更輕量級、更快的datareader類。然而,有時侯用這種方法是不行的,或者當(dāng)你需要多次地對數(shù)據(jù)進(jìn)行排序或篩選時就不能用datareader。
針對同一請求,你需要多次遍歷數(shù)據(jù)。你只能在datareader中循環(huán)一次。如果你想將多個servercontrol類綁定到同一個數(shù)據(jù)集,那么選擇dataset就更好。datareader類不能被綁定到多個servercontrol類,因為它是只向前讀取的。在這種情況下,如果要使用datareader,必須從數(shù)據(jù)庫讀取兩次數(shù)據(jù)。
你需要存儲數(shù)據(jù),而后續(xù)的頁面請求可能會用到的這些數(shù)據(jù)。如果數(shù)據(jù)只被請求它的專門的人使用,你可以將dataset類保存在一個session變量中。如果數(shù)據(jù)可以被任何人訪問,那么你可以將它保存在一個application變量中,或保存在cache中(我建議使用后一種方法,因為它支持時間期限和回調(diào)(callback))。因為datareader類必須一直打開對數(shù)據(jù)庫的連接,而且它一次只能保存一行數(shù)據(jù),所以它們不能在跨頁面請求中被保存。
你需要對一個結(jié)果集的每個元素實現(xiàn)特殊的、耗時的功能。例如,如果你從一個數(shù)據(jù)庫讀取一列郵政編碼,并想通過調(diào)用一個web service來得到每個地區(qū)的詳細(xì)的天氣狀況信息,那么選擇dataset就會更好。這是因為,當(dāng)你在用datareader類時,在關(guān)閉datareader類前,與數(shù)據(jù)庫的連接不會被釋放回連接池。在數(shù)千頁面請求之間潛在的一個很小的延時都會造成web應(yīng)用程序的很高的訪問量,從而就會消耗完可用的連接。相反,dataset可以在前端讀取所有的數(shù)據(jù),并可以馬上關(guān)閉與數(shù)據(jù)庫的連接,將它返回到連接池,因此其它的頁面請求就可以用這個連接了。
你需要在一個兩維范例中加載并處理xml數(shù)據(jù)。dataset類對于xml很有用,因為你可以將dataview用于xml,對根本的數(shù)據(jù)進(jìn)行排序和篩選,就同處理一個數(shù)據(jù)庫結(jié)果集一樣。然而,需要注意的是在system.xml名字空間中有很多類,你可以將它們用于更復(fù)雜的xml操作。
你的數(shù)據(jù)源不是一個數(shù)據(jù)庫。雖然oledbdatareader可以用于任何oledb數(shù)據(jù)提供者(可能指向一個數(shù)據(jù)庫,也可能不指向一個數(shù)據(jù)庫),但dataset對象可以從一個xml文件直接加載數(shù)據(jù),并動態(tài)地解釋它的schema。dataset類也可以將xml數(shù)據(jù)寫回一個數(shù)據(jù)流或一個文件。
從上面的講述我們就可以看到,dataset類比datareader類有更多的功能,這就可以讓你在更多的情況下運用它們。但這并不意味著你總是在用dataset類。你需要在asp.net中完成的相當(dāng)大一部分的任務(wù)都屬于datareader的范疇。
盡管如此,毫無疑問,從重要程度或復(fù)雜程度的角度來說,dataset類在很多asp.net web應(yīng)用程序中都起著很重要的作用。你可以通過明智的緩存來最小化數(shù)據(jù)庫往返,從而降低dataset類的“性能損害”。datareader和dataset都是一個成功的asp.net web應(yīng)用程序的重要的部件。重要的是,我們需要了解何時、在哪里可以最好的使用它們。
新聞熱點
疑難解答
圖片精選