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
{
//return ((object)HttpContext.Current.Session["TotalRowCount"]);
return (object)_totalRowCount;
}
}
}