對于VS 2003DataGrid建立的一些困難與解決辦法
本章講的是VS 2003DataGrid的介紹與技巧,怎樣創(chuàng)建VS 2003DataGrid。這些內(nèi)容都是我花了幾個月的時間查閱資料并向IT精英們學(xué)習(xí)出來的,中間可能有不少錯誤是我沒有挑出的,歡迎大家指正。
但是結(jié)果卻出乎我的意料,DataGrid 的效率 要比 Repeater高!詳細(xì)說一下我的測試方法,請大家看看我的測試方法有沒有什么問題,如果沒有什么問題的話,那么發(fā)生這種想象的原因是什么呢?
硬件:cpu:AMD XP2000+ 、80G硬盤、512M內(nèi)存。軟件:windows 2003 + sp1 、VS2003 、SQL Server 2000 + sp4測試數(shù)據(jù):顯示一張表(城市表)里的數(shù)據(jù),4個字段,349條記錄。測試目的:網(wǎng)站的頁面里面顯示數(shù)據(jù)的效率。只測試顯示數(shù)據(jù)的功能,不管其他的方面
VS 2003DataGrid 使用自動填充,repeater的代碼:
- <table id="DG" >
- <asp:repeater id="Rpt_Test" runat="server">
- <ItemTemplate>
- <tr>
- <td><%# DataBinder.Eval(Container, "DataItem.CityID")%>< SPAN>td>
- <td><%# DataBinder.Eval(Container, "DataItem.ProvinceID")%>
- < SPAN>td>
- <td><%# DataBinder.Eval(Container, "DataItem.City")%>
- < SPAN>td>
- <td><%# DataBinder.Eval(Container, "DataItem.AeraCode")%>
- < SPAN>td>
- < SPAN>tr>
- < SPAN>ItemTemplate>
- < SPAN>asp:repeater>< SPAN>table>
??吹揭恍┪恼抡f repeater 比 VS 2003DataGrid 的性能要好,但是,我的測試結(jié)果是怎么回事呢?
測試結(jié)果:
顯示 10條記錄 ,沒有 ViewState ,DataTable 綁定控件,DataGrid使用綁定列。
1、 DataGrid : 250 rps 左右。
2、 Repeater : <%# DataBinder.Eval(Container, "DataItem.CityID")%>方法: 200 rps 左右。
3、Repeater : <%# ((DataRowView)Container.DataItem)["CityID"] %>方法 : 250 rps 多一點點。
4、Repeater : <%# ((DataRowView)Container.DataItem)[0] %>方法 : 250 rps 多一點點。
其中 3、4 是我剛找到的一種綁定數(shù)據(jù)的方法??磥硎?<%# DataBinder.Eval(Container, "DataItem.CityID")%>這種綁定方法效率太低了。
一般的綁定方法<%# DataBinder.Eval(Container.DataItem, "字段名") %>用DataBinder.eval 綁定不必關(guān)心數(shù)據(jù)來源(Dataread或dataset)。不必關(guān)心數(shù)據(jù)的類型eval會把這個數(shù)據(jù)對象轉(zhuǎn)換為一個字符串。在底層綁定做了很多工作,使用了反射性能。#t#
正因為使用方便了,但卻影響了數(shù)據(jù)性能。來看下<%# DataBinder.Eval(Container.DataItem, "字段名") %>。當(dāng)于dataset綁定時,DataItem其實式一個DataRowView(如果綁定的是一個數(shù)據(jù)讀取器(dataread)它就是一個 IdataRecord。)因此直接轉(zhuǎn)換成DataRowView的話,將會給性能帶來很大提升。
對數(shù)據(jù)的綁定建議使用<%# ctype(Container.DataItem,DataRowView).Row("字段名") %>。數(shù)據(jù)量大的時候可提高幾百倍的速度。使用時注意2方面:1.需在頁面添加<%@ Import namespace="System.Data"%>.2.注意字段名的大小寫(要特別注意)。如果和查詢的不一致,在某些情況下會導(dǎo)致比< %# DataBinder.Eval(Container.DataItem, "字段名") %>還要慢。如果想進一步提高速度,可采用<%# ctype(Container.DataItem,DataRowView).Row(0) %>的方法。不過其可讀性不高。