- 相關(guān)推薦
在A(yíng)SP.NETWeb應用程序中我應該用DataReader類(lèi)還是DataSet類(lèi)
ADO.NET提供了兩個(gè)主要的類(lèi)來(lái)讀取數據。通過(guò)本文我們可以學(xué)習如何在兩者之間進(jìn)行選擇。
我經(jīng)常聽(tīng)到有人問(wèn)這個(gè)問(wèn)題:“在A(yíng)SP.NETWeb應用程序中我應該用DataReader類(lèi)還是DataSet類(lèi)呢?”在很多文章以及新聞組的貼子中我經(jīng)?吹竭@樣的誤解,即認為DataReader(SqlDataReader或OleDbDataReader的縮寫(xiě))比DataSet好。有時(shí)候我也會(huì )看到相反的說(shuō)法。事實(shí)上,Microsoft創(chuàng )建了這兩個(gè)數據存取類(lèi)是因為它們都是我們所需要的。每個(gè)類(lèi)都有其優(yōu)點(diǎn)和不足,你可以根據應用環(huán)境來(lái)選擇用哪一個(gè)。
本文就兩者的選擇問(wèn)題做了很清楚的講述,可以讓你在運用ASP.NET時(shí),在選擇DataReader類(lèi)或DataSet類(lèi)的方面得到一些指南。在基于客戶(hù)端的WindowsForm應用程序環(huán)境下,這些規則可能會(huì )改變。我在做這些講述時(shí),假設你已經(jīng)用過(guò)DataReader和DataSet類(lèi)了,并對它們很熟悉。
運用DataReader類(lèi)
下面就是運用DataReader類(lèi)的理想條件:你讀取的數據必須是新的,所以在每次需要數據的時(shí)候,你都必須從數據庫讀取。創(chuàng )建一個(gè)DataReader類(lèi)不會(huì )消耗很多內存,不過(guò)隨著(zhù)負荷的增加,DataSet上的性能也會(huì )很快地提高(參考資源中VisualStudioMagazine中的文章)。
你對每行數據的需求很簡(jiǎn)單。該情況的最好的例子就是簡(jiǎn)單地將DataReader綁定到一個(gè)Web控件,如DataGrid或DropDownList。
你只需要從數據庫中以只向前的(forward-only)、只讀的形式來(lái)存取XML數據。在這種情況下,你可以用SQLCommand對象的ExcecuteXmlReader()方法來(lái)得到一個(gè)XmlReader類(lèi)(相當于XML版的DataReader)。這就需要一個(gè)運用FORXML子句的SQLServer查詢(xún),或者一個(gè)包含有效XML的ntext字段。
你計劃對數據庫進(jìn)行幾個(gè)重復的調用,來(lái)讀取一小塊信息。在這種情況下,我們前面提到過(guò)的性能數據會(huì )有更大的提高。的確,使DataSet類(lèi)更強大的許多功能只適用于基于客戶(hù)端的WindowsForm應用程序,比如在多個(gè)表之間建立關(guān)系的功能。在很多情況下,DataSet類(lèi)都比DataReader類(lèi)更有優(yōu)勢,而且在有些情況下,你根本就不能用DataReader類(lèi)。
運用DataSet類(lèi)
在下面的情況,你應該考慮運用DataSet類(lèi):你構建了一個(gè)Webservice,它運用的數據是你作為返回值讀取的數據。因為DataReader類(lèi)必須保持到數據庫的連接,所以它們不能被序列化到XML中,也不能被發(fā)送給一個(gè)Webservice的調用者。
你需要排序或篩選數據。在運用一個(gè)DataView對象(呈現為DataTable類(lèi)的DefaultView屬性,它包含一個(gè)DataSet類(lèi))來(lái)排序或篩選數據前,我們先試著(zhù)用SQL查詢(xún)(如WHERE和ORDERBY語(yǔ)句)來(lái)實(shí)現這些功能,并運用更輕量級、更快的DataReader類(lèi)。然而,有時(shí)侯用這種方法是不行的,或者當你需要多次地對數據進(jìn)行排序或篩選時(shí)就不能用DataReader。
針對同一請求,你需要多次遍歷數據。你只能在DataReader中循環(huán)一次。如果你想將多個(gè)ServerControl類(lèi)綁定到同一個(gè)數據集,那么選擇DataSet就更好。DataReader類(lèi)不能被綁定到多個(gè)ServerControl類(lèi),因為它是只向前讀取的。在這種情況下,如果要使用DataReader,必須從數據庫讀取兩次數據。
你需要存儲數據,而后續的頁(yè)面請求可能會(huì )用到的這些數據。如果數據只被請求它的專(zhuān)門(mén)的人使用,你可以將DataSet類(lèi)保存在一個(gè)Session變量中。如果數據可以被任何人訪(fǎng)問(wèn),那么你可以將它保存在一個(gè)Application變量中,或保存在Cache中(我建議使用后一種方法,因為它支持時(shí)間期限和回調(callback))。因為DataReader類(lèi)必須一直打開(kāi)對數據庫的連接,而且它一次只能保存一行數據,所以它們不能在跨頁(yè)面請求中被保存。
你需要對一個(gè)結果集的每個(gè)元素實(shí)現特殊的、耗時(shí)的功能。例如,如果你從一個(gè)數據庫讀取一列郵政編碼,并想通過(guò)調用一個(gè)Webservice來(lái)得到每個(gè)地區的詳細的天氣狀況信息,那么選擇DataSet就會(huì )更好。這是因為,當你在用DataReader類(lèi)時(shí),在關(guān)閉DataReader類(lèi)前,與數據庫的連接不會(huì )被釋放回連接池。在數千頁(yè)面請求之間潛在的一個(gè)很小的延時(shí)都會(huì )造成Web應用程序的很高的訪(fǎng)問(wèn)量,從而就會(huì )消耗完可用的連接。相反,DataSet可以在前端讀取所有的數據,并可以馬上關(guān)閉與數據庫的連接,將它返回到連接池,因此其它的頁(yè)面請求就可以用這個(gè)連接了。
你需要在一個(gè)兩維范例中加載并處理XML數據。DataSet類(lèi)對于XML很有用,因為你可以將DataView用于XML,對根本的數據進(jìn)行排序和篩選,就同處理一個(gè)數據庫結果集一樣。然而,需要注意的是在System.Xml名字空間中有很多類(lèi),你可以將它們用于更復雜的XML操作。
你的數據源不是一個(gè)數據庫。雖然OleDbDataReader可以用于任何OLEDB數據提供者(可能指向一個(gè)數據庫,也可能不指向一個(gè)數據庫),但DataSet對象可以從一個(gè)XML文件直接加載數據,并動(dòng)態(tài)地解釋它的schema。DataSet類(lèi)也可以將XML數據寫(xiě)回一個(gè)數據流或一個(gè)文件。
從上面的講述我們就可以看到,DataSet類(lèi)比DataReader類(lèi)有更多的功能,這就可以讓你在更多的情況下運用它們。但這并不意味著(zhù)你總是在用DataSet類(lèi)。你需要在A(yíng)SP.NET中完成的相當大一部分的任務(wù)都屬于DataReader的范疇。
盡管如此,毫無(wú)疑問(wèn),從重要程度或復雜程度的角度來(lái)說(shuō),DataSet類(lèi)在很多ASP.NETWeb應用程序中都起著(zhù)很重要的作用。你可以通過(guò)明智的緩存來(lái)最小化數據庫往返,從而降低DataSet類(lèi)的“性能損害”。DataReader和DataSet都是一個(gè)成功的ASP.NETWeb應用程序的重要的部件。重要的是,我們需要了解何時(shí)、在哪里可以最好的使用它們。
【在A(yíng)SP.NETWeb應用程序中我應該用DataReader類(lèi)還是Dat】相關(guān)文章:
素描應該用鉛筆還是炭筆10-04
荷蘭留學(xué)選擇H類(lèi)大學(xué)還是U類(lèi)大學(xué)08-22
演講中應如何把持好場(chǎng)面08-18
員工在激勵中應如何得到薪酬?09-04
平面設計中應注意的美學(xué)10-17
演講和社交中應注意的面部表情09-21
挖掘機駕駛中應注意的問(wèn)題08-12