国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
DataReader與DataSet,DataGrid與DataList

[轉(zhuǎn)]DataReader與DataSet,DataGrid與DataList

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




關(guān)于何種情況下使用DataGrid、DataList或Repeater的一些討論

[概述] 

  WEB開發(fā)自從有了基于腳本的WEB編程技術(shù)(如ASP)以來,經(jīng)歷了一個(gè)漫長的過程。通過使用微軟的asp.net技術(shù),傳統(tǒng)的ASP中大量的、單調(diào)乏味的、重復(fù)性的編程工作成為了歷史。例如,象大多數(shù)ASP程序員所知的,在ASP中顯示數(shù)據(jù)庫內(nèi)容所需要的過程: 

  建立數(shù)據(jù)庫連接 
  用SQL查詢裝載ADO數(shù)據(jù)集 
  顯示所需要的任何HTML代碼 
  遍歷數(shù)據(jù)集中的記錄 
  輸出記錄字段值及相關(guān)的HTML 
  移向下一條記錄 
  循環(huán) 
  顯示所需要的HTML代碼 

  又如,為了在表格中顯示記錄集的內(nèi)容,我們需要輸出一個(gè)<table>標(biāo)簽,然后開始循環(huán)。在循環(huán)中,每輸出一條記錄,需要先輸出一個(gè)<tr>標(biāo)簽以及若干對<td>標(biāo)簽和</tr>標(biāo)簽。最后,以一個(gè)</table>標(biāo)簽結(jié)尾。 

  在傳統(tǒng)的ASP中使用的這種方法有一個(gè)主要的缺點(diǎn):HTML代碼與ASP源代碼不得不糾纏在一起。對于那些也許并不理解程序設(shè)計(jì)的頁面設(shè)計(jì)者或圖形藝術(shù)家來說,想要更改HTML內(nèi)容無疑是一場災(zāi)難。另外,代碼的產(chǎn)生量也是驚人的,因?yàn)槲覀儾粌H需要從數(shù)據(jù)庫中取得數(shù)據(jù),還需要使之可視化。 

  好在,ASP.Net提供了三個(gè)數(shù)據(jù)控件,使得原本在ASP中繁雜的工作變得簡單。這三個(gè)控件屬于數(shù)據(jù)Web控件,分別是DataGrid,DataList和Repeater。如果你對ASP.Net數(shù)據(jù)庫編程有所了解的話,你至少應(yīng)該有使用其中一種控件的經(jīng)驗(yàn)。大多數(shù)情況下,我們從學(xué)習(xí)使用DataGrid開始,因?yàn)樗墓δ芟鄬ν暾〝?shù)據(jù)顯示、分頁、編輯)并相對簡單。然而,DataGrid并非總是正確的選擇。 

  本文將分別論述每個(gè)數(shù)據(jù)控件不同于其它數(shù)據(jù)控件的特點(diǎn),以及由此帶來的優(yōu)缺點(diǎn)。正因?yàn)槊糠N數(shù)據(jù)控件都有其自身的缺陷,因此在程序設(shè)計(jì)中并不存在最完美的選擇。你必須權(quán)衡三種控件的優(yōu)缺點(diǎn)并決定哪一種更加適合你的程序。 

  為了幫助比較,在對每個(gè)控件進(jìn)行論述時(shí),我們會專注于三個(gè)特性:可用性(從頁面訪問者的角度)、開發(fā)時(shí)間和性能。我們首先描述一下這三種控件的共性,然后分別深入地討論三種控件的特點(diǎn),每種控件如何實(shí)現(xiàn)以及如何體現(xiàn)可用性、開發(fā)時(shí)間和性能。 


[數(shù)據(jù)控件(Data Web Controls)的共同點(diǎn)] 

  在我們討論三種控件各自特性之前,有必要先看一看它們之間的共同點(diǎn)。一般來說,從編程流程來看,最顯著的共同點(diǎn)就是,這三種控件都是用來顯示數(shù)據(jù)的。另一個(gè)共同點(diǎn)是需要一個(gè)數(shù)據(jù)綁定的代碼來將數(shù)據(jù)與控件綁定。這個(gè)過程只需要兩行代碼: 

  dataWebControlID.DataSource = someDataSource 
  dataWebControlID.DataBind()   

  一般情況下,someDataSource對象是指數(shù)據(jù)控件的數(shù)據(jù)源屬性,可以是DataSet,SqlDataReader,OleDbDataReader或一組數(shù)據(jù)(如數(shù)組、數(shù)組列表或其它的屬于System.Collection名空間的類)。不過,任意實(shí)現(xiàn)IEnumerable接口的對象也可以被綁定在數(shù)據(jù)控件上。 

  DataBind()方法遍歷一個(gè)特定的DataSource中的記錄,并對其中的每條記錄,建立一個(gè)條目并對應(yīng)數(shù)據(jù)控件的Item集。數(shù)據(jù)控件中的每個(gè)條目將成為一個(gè)類的實(shí)例。這個(gè)類因數(shù)據(jù)控件的不同而有所區(qū)別。例如,DataGrid中的每個(gè)條目是DataGridItem類的一個(gè)實(shí)例,而Repeater中的條目則是RepeaterItem類的一個(gè)實(shí)例。 

  之所以使用不同的類來實(shí)例化不同數(shù)據(jù)控件的條目,是因?yàn)椴煌臄?shù)據(jù)控件將會使用不同的方式顯示數(shù)據(jù)及相應(yīng)的HTML代碼。例如,DataGridItem類繼承自TableRow類,也就是說,每個(gè)DataGridItem的實(shí)例或多或少地可以看成一個(gè)表格中的一行。這是因?yàn)镈ataGrid被設(shè)計(jì)成可以借助HTML中的<table>標(biāo)簽以表格的形式顯示數(shù)據(jù),因此每條記錄就是一個(gè)表格行。而Repeater則被設(shè)計(jì)成可以自由定義數(shù)據(jù)輸出的方式。所以,RepeaterItem并不繼承自TableRow就不奇怪了。 

  另一個(gè)三種數(shù)據(jù)控件的相同點(diǎn)是每種控件都被允許使用模板來顯示數(shù)據(jù)。DataList和Repeater控件必須使用模板來輸出數(shù)據(jù),而DataGrid則允許通過TemplateColumn而只使用模板來顯示一列(在DataGrod單元中詳細(xì)論述)。 

  另一個(gè)不是十分值得比較的地方是:DataGrid和DataList都是繼承自WebControl類,而Repeater則是繼承自Control類。WebControl類包含一些用于美化的屬性,如:BackColor、ForeColor、CssClass、BorderStyle等等。這說明在使用DataGrid或DataList時(shí),你可以設(shè)定這些屬性來個(gè)性化輸出。Repeater控件則不具有這些屬性。我們會在Repeater單元討論如何使用模板來美化Repeater的輸出。 


[DataGrid控件] 

  在三種控件當(dāng)中,DataGrid是迄今為止功能最為豐富的,但也是最不靈活的控件。這種在輸出HTML時(shí)不夠靈活的特點(diǎn)是因?yàn)樗畛蹙褪潜辉O(shè)計(jì)成以表格的形式輸出數(shù)據(jù)。每一條記錄輸出時(shí)會建立一對<tr>標(biāo)簽,而每個(gè)字段的值輸出時(shí)則建立一對<td>標(biāo)簽。 

  DataGrid含有幾個(gè)屬性可以提高其可用性。如,通過設(shè)置DataGrid的AllowSorting屬性為true,并加入少量代碼,DataGrid就具備了按不同字段排序的功能。此外,設(shè)定相關(guān)屬性來實(shí)現(xiàn)分頁以及單條記錄編輯的功能更加增強(qiáng)了DataGrid的可用性。 

  除了在可用性方面的支持以外,DataGrid同時(shí)也相當(dāng)節(jié)省開發(fā)時(shí)間。使用DataGrid在WEB頁面上顯示數(shù)據(jù)只需要兩行代碼。一行用來設(shè)定與DataGrid綁定的數(shù)據(jù)源(DataSource),另一條則用來執(zhí)行綁定命令(DataBind())。當(dāng)然,在Repeater中實(shí)現(xiàn)這樣的功能并非不可能,只是,相比較使用DataGrid而言,你需要花費(fèi)相當(dāng)多的時(shí)間和精力來實(shí)現(xiàn)這些功能。 

  盡管DataGrid有這樣那樣令人印象深刻的優(yōu)點(diǎn),它的兩個(gè)缺點(diǎn)也同樣不能忽視。首先,如前所述,DataGrid在個(gè)性化輸出數(shù)據(jù)方面功能有限。當(dāng)然,你可以定制字體、顏色以及線條寬度等等,但它始終只能是HTML表格。 

  每個(gè)在DataGrid中的列都是DataGridColumn類的一個(gè)實(shí)例。有五種DataGrid列的形式: 

  ·BoundColumn 
  ·ButtonColumn 
  ·EditColumn 
  ·HyperLinkColumn 
  ·TemplateColumn 

  每種類型都會以一種方式允許頁面訪問與DataGrid進(jìn)行交互。例如,BoundColumn將DataSource的字段值顯示為純文本;而HyperLinkColumn則將之顯示為一個(gè)超級鏈接。另外,開發(fā)者可以通過寫一個(gè)繼承自DataGridColumn的自定義類來定制DataGrid列的樣式。 

  盡管DataGrid具有這么多的增強(qiáng)可用性的屬性,卻仍然顯得死板而不夠靈活。這是因?yàn)?,不論什么樣的屬性,都需要對DataGrid所生成的表格進(jìn)行相關(guān)的設(shè)置而生效。這無疑會使表格變得臃腫而失去靈活性。例如,DataGridColumn的設(shè)置會對表格的每一行的相應(yīng)列生效。DataGrid的這種局限性阻礙了更有創(chuàng)意地顯示數(shù)據(jù)。比如,你希望每五條記錄被顯示在一行,或根本不想要表格來顯示數(shù)據(jù),你將不得不放棄使用DataGrid。 

  DataGrid的第二個(gè)缺陷是它的性能。在三種數(shù)據(jù)控件中,DataGrid是相對性能最差的。由DataGrid所生成的ViewState將會相當(dāng)龐大,特別是在DataGrid含有較多的行時(shí)。當(dāng)然,你也可以關(guān)閉ViewState功能,但代價(jià)是你將不能使用排序、分頁以及記錄編輯等功能。 

  為了測量DataGrid的性能,我使用了微軟的Web Application Stress Tool (WAST)。精確的測試條件設(shè)定以及測試用代碼將會在本文的結(jié)尾給出。 

  WAST將會對WEB服務(wù)器發(fā)出對一個(gè)特定URL的請求。每個(gè)測試將會針對一個(gè)URL在一分鐘之內(nèi)連續(xù)不斷地請求。WAST將會一個(gè)代表性能的數(shù)值,代表WEB服務(wù)器將會在一秒鐘內(nèi)執(zhí)行ASP.Net頁面多少次。 

  兩個(gè)測試將顯示一個(gè)僅僅顯示數(shù)據(jù)的DataGrid。DataGrid將會顯示Northwinds數(shù)據(jù)庫中的Customers表的4個(gè)字段的內(nèi)容(總計(jì)91條記錄)。DataGrid的AutoGenerateColumns屬性將會被設(shè)為True。第一個(gè)測試將DataGrid置于一個(gè)Form中,第二個(gè)則不置于Form中。將控件置于Form中而不指定其EnableViewState為False,則控件將會一直使用ViewState來維持其狀態(tài)。對ViewState的設(shè)定是為了有一個(gè)耗時(shí)的處理過程,來看一下它對于每秒種的頁面請求有什么樣的影響。 

 


在下面我們要討論并測試的DataList和Repeater中,我們會看到它們的性能將優(yōu)于DataGrid。 


[DataList控件] 

  如前所述,DataGrid使用表格來顯示數(shù)據(jù)。你也許需要更進(jìn)一步地控制數(shù)據(jù)的顯示。例如,你想使數(shù)據(jù)在表格中顯示,但不是每行只有一條記錄,而是多條。又或者,你并不想使用表格來顯示數(shù)據(jù),而是只將它們顯示在一系列<span>標(biāo)簽中。 

  DataList放棄了DataGrid中列表顯示數(shù)據(jù)的概念,而是使用事先定義好的模板(Template)來定制顯示。通過使用模板,可以同時(shí)使用HTML標(biāo)簽或數(shù)據(jù)綁定。這里的數(shù)據(jù)綁定的形式為:<%# … %>,用來顯示數(shù)據(jù)源中給定條目的數(shù)據(jù)記錄。如下的ItemTemplate將會顯示數(shù)據(jù)源中CompanyName字段: 

   <asp:DataList runat="server" id="myDataList"> 
  <ItemTemplate> 
  <%# DataBinder.eval_r(Container.DataItem, "CompanyName") %> 
  </ItemTemplate> 
  </asp:DataList> 

  通過修改上面的模板,我們可以使CompanyName字段顯示為粗體字,而ContactName字段則以正常式樣顯示在CompanyName之下。 

  <asp:DataList runat="server" id="myDataList"> 
  <ItemTemplate> 
  <b><%# DataBinder.eval_r(Container.DataItem, "CompanyName") %></b> 
  <br /> 
  <%# DataBinder.eval_r(Container.DataItem, "ContactName") %> 
  </ItemTemplate> 
  </asp:DataList> 

  對于DataList數(shù)據(jù)源中的每一條記錄,ItemTemplate會通過定義HTML標(biāo)簽來以相同的樣式顯示數(shù)據(jù)。ItemTemplate還支持其它其它6種模板: 

  ·AlternatingItemTemplate 
  ·EditItemTemplate 
  ·FooterTemplate 
  ·HeaderTemplate 
  ·ItemTemplate 
  ·SelectedItemTemplate 
  ·SeparatorTemplate 

  默認(rèn)情況下DataList會將記錄顯示在HTML表格中。然而,通過設(shè)定RepeatColumn屬性,你可以設(shè)置在一行中顯示多少條記錄。更進(jìn)一步,你甚至可以指定DatList的內(nèi)容不顯示在表格中,而是<span>標(biāo)簽中。這可以通過設(shè)定RepearLayout屬性來實(shí)現(xiàn)。 

  通過模板、RepeatColumn和RepeatLayout屬性,很明顯DataList在定制數(shù)據(jù)輸出樣式方面較DataGrid更具靈活性,使得用戶界面設(shè)計(jì)可以更加友好。當(dāng)然,我們還需要進(jìn)行功能性的對比,如分頁、排序、記錄編輯等等。 

  通過EditItemIndex模板和EditCommand,UpdateCommand以及CancelCommand事件,DataList將支持記錄編輯的功能。不過,比較DataGrid而言,這需要耗費(fèi)更多的開發(fā)時(shí)間來實(shí)現(xiàn)。這種開發(fā)時(shí)間上的不一致主要有兩個(gè)原因: 

  ·編輯/更新/刪除按鈕在DataGrid中可以通過設(shè)定EditCommandColumn來自動添加;而在DataList中則需要手動添加。 

  ·DataGrid的BoundColumn列樣式自動使用文本框控件來顯示記錄編輯界面。而在DataList中,你必須通過EditItemTemplate明確地指定使用什么樣的編輯界面。 

  實(shí)現(xiàn)DataList中的分頁、排序功能同記錄編輯功能情況一樣,并不算非常復(fù)雜。這些功能可以通過巧妙的編程加以實(shí)現(xiàn),只是耗費(fèi)一些開發(fā)時(shí)間。所以,如果需要用戶對數(shù)據(jù)記錄進(jìn)行排序或編輯的話,使用DataGrid要比使用DataList方便得多。 

  DataList的性能要比DataGrid好一些,特別是當(dāng)DataList被包含在Form當(dāng)中時(shí)。圖2顯示了WAST對DataList的測試。 

  可以看出,在被Web Form包含的情況下,DataList的性能要明顯好于DataGrid。 


[Repeater控件] 

  Repeater控件是三種數(shù)據(jù)控件中在HTML輸出方面最為靈活的控件。Repeater會按照你所要求的樣式嚴(yán)格地輸出數(shù)據(jù)記錄。所以,如果你不想以表格方式或者簡單的<span>輸出數(shù)據(jù),那么最好使用Repeater。 

  與DataList一樣,Repeater使用模板來指定輸出樣式。Repeater支持如下五種模板: 

  ·AlternatingItemTemplate 
  ·FooterTemplate 
  ·HeaderTemplate 
  ·ItemTemplate 
  ·SeparatorTemplate 

  HederTemplate和FooterTemplate指定在真正的記錄輸出之前或之后應(yīng)處理的HTML內(nèi)容。AlternatingItemTemplate和ItemTemplate則指定實(shí)際的每條輸出記錄的HTML樣式。如,你需要綁定一個(gè)包含雇員信息的DataSet到一個(gè)Repeater,字段名為EmployeeName。如果你想在頁面中不排序地顯示這些記錄,你可以使用如下的語句: 

  <asp:Repeater runat="server" id="rptEmployees"> 
  <HeaderTemplate> 
  <ul> 
  </HeaderTemplate> 
  <ItemTemplate> 
  <li><%# DataBinder.eval_r(Container.DataItem, "EmployeeName") %></li> 
  </ItemTemplate> 
  <FooterTemplate> 
  </ul> 
  </FooterTemplate> 
  </asp:Repeater> 

  Repeater類不是繼承自WebControl類的,這一點(diǎn)與DataGrid和DataList不同。所以,Repeater沒有樣式方面的屬性可供設(shè)定。也就是說,如果你想格式化輸出Repeater的數(shù)據(jù)記錄,你必須使用HTML標(biāo)簽來設(shè)定樣式。如,在一例中,如果我們想將雇員名字顯示成粗體,我們必須在ItemTemplate設(shè)置相應(yīng)的HTML標(biāo)簽: 

  <ItemTemplate> 
  <li><b><%# DataBinder.eval_r(Container.DataItem, "EmployeeName")%></b></li> 
  </ItemTemplate> 

  而如果使用DataGrid或DataList,我們只通過設(shè)定ItemStyle-Font-Bold屬性為True即可實(shí)現(xiàn)。 

  Repeater在格式化設(shè)定上的欠缺,直接反映到開發(fā)時(shí)間的延長上來。對輸出數(shù)據(jù)樣式上的越多要求,就越會導(dǎo)致開發(fā)周期的延長。這些在模板中規(guī)定樣式的HTML標(biāo)簽也越發(fā)得顯得混亂,而且,在將來頁面更改時(shí)會更加困難,特別是當(dāng)一個(gè)新的開發(fā)人員接替工作時(shí)。而使用DataGrid或DataList你盡可以只設(shè)定樣式屬性,而不使用模板。而且,如果使用Visual Studio.Net或ASP.Net Web Matrix工作時(shí),這些屬性更可以被直接設(shè)定而無需編碼。 

  因?yàn)镽epeater開發(fā)時(shí)間的延長,其在內(nèi)建功能(分頁、排序及編輯)上的支持也顯得不足。因此在可用性方面,Repeater有著明顯的缺陷。當(dāng)然,<b>如果</b>用戶對于如何顯示數(shù)據(jù)無所謂的話,這也算不了什么大問題。我之所以強(qiáng)調(diào)這個(gè)“如果”,是因?yàn)楸M管用戶有時(shí)在設(shè)計(jì)時(shí)并不要求能夠分頁、排序或編輯記錄,但這樣的要求往往會在開發(fā)后期,或在他們能看到顯示出來的記錄后產(chǎn)生。 

  Repeater唯一優(yōu)于DataGrid和DataList的特點(diǎn)是它的性能,尤其明顯優(yōu)于DataGrid。而比DataList略高一點(diǎn)點(diǎn)。 


[結(jié)論] 

  在ASP.Net頁面上顯示數(shù)據(jù)時(shí),多數(shù)的程序員會選擇他們所熟悉的控件來使用,特別是DataGrid。然而,這樣盲目的選擇在沒有“最好的通用控件”的情況下是不明智的。在選擇控件來顯示數(shù)據(jù)前,不妨問自己幾個(gè)問題來幫助決策:是否允許用戶對記錄排序?是不是記錄需要顯示在非表格的情況下?頁面是否會被高頻度地訪問,因此應(yīng)多考慮性能? 

  DataGrid提供了最多的功能,如允許訪問者對記錄編輯、排序或分頁。同時(shí)它也是最容易使用的,甚至于簡單到只需要將之添加到頁面中而不必額外編寫代碼。不過這些易用性是以性能的損失為代價(jià)的。DataGrid在三種控件中是效率最低的,特別是在使用Web Form的情況下。 

  通過使用模板,DataList提供了比DataGrid更加優(yōu)秀的界面效果。不過這需要以犧牲一定的開發(fā)時(shí)間為代價(jià)。為了添加排序、分頁和編輯功能,程序員不得不花費(fèi)比使用DataGrid更多的精力來進(jìn)行編碼,雖然它的性能要優(yōu)于DataGrid。 

  最后,Repeater允許對數(shù)據(jù)記錄作最大限度的HTML定制。通常,使用Repeater來顯示數(shù)據(jù)記錄比使用DataGrid和DataList要耗費(fèi)更長的開發(fā)時(shí)間。另外,它不支持內(nèi)建的編輯、排序和分頁功能。所幸的是,Repeater在性能上要優(yōu)于其它兩種控件,特別是明顯優(yōu)于DataGrid。 


[附錄] 

WAST測試設(shè)定 

  測試是在運(yùn)行Microsoft Windows 2003 Server操作系統(tǒng)的筆記本電腦上完成的?;九渲萌缦拢篒ntel P4 2.4G CPU;512 MB RAM;30GB Ultra ATA Hard drive;網(wǎng)頁服務(wù)器使用IIS 6.0;ASP.Net版本為1.1。此測試中的WAST被設(shè)置成使用單線程,每個(gè)測試時(shí)間為一分鐘。 
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)于何種情況下使用DataGrid、DataList或Repeater的一些討論
數(shù)據(jù)綁定
ASP.NET 2.0 – 善用DataSourceMode屬性 (轉(zhuǎn))
第15章
ASP.NET中g(shù)ridview、datalist、repeater、FormView、DetailsView的區(qū)別詳解
利用 ASP.NET、JavaScript 和 OLE DB 從頭設(shè)計(jì)您自己的網(wǎng)絡(luò)日記應(yīng)用程序
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服