【转】GridView 有效率的分頁設計(asp.net)
ASP.NET 的GridView提供很方便的分頁功能,但對於龐大的資料,User 每瀏覽一頁就要到資料庫將所有的資料撈回前端,再進行分頁顯示分頁結果,這樣對效能影響很大,雖然可以設定Datasource的Cache,讓分頁時不用到資料庫撈,直接傳Cache讀,但相對的也會占用的WebServer的記憶體,比較好的方法就是由Stored Procedure 進行分頁,僅傳回該頁的資料,這樣就可以大大提高效能。
Stored Procedure 進行分頁的方法如果是在 SQL Server 2000 可以用 Temp table or table variant , 另外可以利用 Set row count 的方法提高效能。
http://www.4guysfromrolla.com/webtech/042606-1.shtml
至於 SQL Server 2005 就不用這麼麻煩,因為有新的ROW_NUMBER function
CREATE PROCEDURE dbo.ShowLog
@PageIndex INT,
@PageSize INT
AS
BEGIN
WITH LogEntries AS (
SELECT ROW_NUMBER() OVER (ORDER BY Date DESC)AS Row, Date, Description
FROM LOG)
SELECT Date, Description
FROM LogEntries
WHERE Row between (@PageIndex - 1) * @PageSize + 1 and @PageIndex*@PageSize
END
至於ASP.NET 端就要配合 objectDataSource 不能用 SqlDataSource,因為如果用 SqlDataSource就不能用GridView 的分頁功能,而要自己寫分頁,使用objectDataSource時你可以自己寫business object , 或是使用 V.S. 2005 的 Dataset Designer , 它會幫你產生 TableAdapters 讓你可以用在 objectDataSource。
你需要設定 objectDataSource 的
EnablePaging = true
MaximumRowsParameterName
startRowIndexParameterName
SelectCountMethod
SelectMethod
只是這裡有一個效能的考量,因為 objectDataSource 會先call SelectCountMethod 取得 Page 的 資料,再 call SelectMethod 取得總共有多少筆資料,這樣它才有辦法算頁數,只是這樣就會有兩次的 資料庫連線,如果我們在SelectCountMethod就已經傳回 總共有多少筆,有辦法用這個資料嗎?
答案是有的,只是要用的.net framework 2.0 partial class 的功能,去擴充TableAdapters ,如下的範例:
namespace MyDataSetTableAdapters{
///
/// Summary description for MyDataSetTableAdapters
///
///
public partial class usp_Select_Netatm_logTableAdapter:Component {
private int _totalRowCount = 0;
public int TotalRowCount {
get {
return _totalRowCount;
}
set
{
_totalRowCount = value;
}
}
public int SelectCommandTimeout
{
get
{
return (this._commandCollection[0].CommandTimeout);
}
set
{
for (int i = 0; i < commandtimeout =" value;"> startRowIndex, System.Nullable maximumRows, string IcpNo, DateTime QryFromDate, DateTime QryToDate, ref System.Nullable totalRows)
{
//return ((object)HttpContext.Current.Session["TotalRowCount"]);
return (object)_totalRowCount;
}
}
}
posted on 2009-06-30 01:54 LeeXiaoLiang 阅读(322) 评论(0) 收藏 举报
浙公网安备 33010602011771号