天天看點

分頁查詢的三種方法

一.    基于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伺服器之間帶寬不是瓶頸時使用(同一台計算機上不會有帶寬問題)。