一. 基于SQL的分頁查詢
1、TOP法
SELECT TOP 10 *
FROM books
WHERE id NOT IN (SELECT TOP 20 Id FROM books ORDER BY UnitPrice)
ORDER BY UnitPrice
2、ROW_NUMBER()法
SELECT *
FROM (SELECT ROW_NUMBER() OVER(ORDER BY UnitPrice) AS PriceRank,* FROM books) AS Rank
WHERE PriceRank BETWEEN 21 AND 30
ORDER BY UnitPrice
小結:
TOP法适用于多種資料庫,而ROW_NUMBER()是微軟SQL SERVER所提供的對結果集重新進行編号的函數,是以僅适用于資料庫SQL SERVER。
從速度上講,兩者通路10萬條記錄時,所需的時間都差不多是20多秒,但TOP法總是比ROW_NUMBER()法快幾秒鐘。
在書寫方面,ROW_NUMBER()法容易被人了解。
具體該選中何種方法,筆者認為應優先選用TOP法。
二. 基于PagedDataSource的分頁
public partial class 上機_HotBookList : System.Web.UI.Page
{
//建立分頁對象
PagedDataSource pdsPage = new PagedDataSource();
protected void Page_Load(object sender, EventArgs e)
{
//判斷是否是回傳頁
if (!IsPostBack)
{
//使用狀态保持儲存Page頁數
ViewState["Page"] = 0;
}
Databind();
}
private void Databind()
{
//将傳回的圖書集合與
pdsPage.DataSource = BookManager.GetHotBooks();
//設定目前頁
pdsPage.CurrentPageIndex = Pager;
//設定每頁的大小
pdsPage.PageSize = 5;
//是否允許分頁顯示
pdsPage.AllowPaging = true;
//在Label控件中顯示"第X頁 共Y頁"
lblCurrentPage.Text = "第" + (pdsPage.CurrentPageIndex + 1) + "頁 共" + pdsPage.PageCount + "頁";
//移除DataList對象的ObjectDataSource對象
DataList1.DataSourceID = "";
//将DataList對象的資料源與分頁對象綁定
DataList1.DataSource = pdsPage;
DataList1.DataBind();
SetEnable();
}
private void SetEnable()
{
//hlBack、hlForward分别為HyperLink對象
hlBack.Enabled = true;
hlForward.Enabled = true;
//如果該頁為第一頁,則禁用【上一頁】
if (pdsPage.IsFirstPage)
{
hlBack.Enabled = false;
}
//如果該頁為最後一頁,則禁用【下一頁】
if (pdsPage.IsLastPage)
{
hlForward.Enabled = false;
}
}
//Pager屬性
public int Pager
{
get
{
return (int)ViewState["Page"];
}
set
{
ViewState["Page"] = value;
}
}
//【下一頁】的Click事件
protected void hlForward_Click(object sender, EventArgs e)
{
Pager++;//頁數加一
Databind();
}
//【上一頁】的Click事件
protected void hlBack_Click(object sender, EventArgs e)
{
Pager--;//頁數減一
Databind();
}
}
基于SQL語句的分頁和基于PagedDataSource的分頁優缺點比較:
基于SQL語句的分頁方式每次傳回資料量較少(僅傳回目前頁所需資料),适合大資料量(百萬資料級)的資料進行分頁,隻是代碼編寫比較複雜。
PagedDataSource使用比較友善,封裝了分頁正常的屬性,但由于一次将所有資料讀入,比較占用資源,一般适合資料量較少(一般不超過一萬行),并且資料庫伺服器和Web伺服器之間帶寬不是瓶頸時使用(同一台計算機上不會有帶寬問題)。