sqlserver 高品质分页实现解析

先来说说实现情势:
1、大家来假定Table中有三个一度建构了目录的主键字段ID,大家将遵纪守法那个字段来取数据开展分页。
2、页的深浅大家身处@PageSize中 3、当前页号大家位于@CurrentPage中
4、如何让记录指针急迅轮转到大家要取的数量开首的那一行呢,这是关键所在!有了Set
RowCount,我们就十分轻易达成了。
5、假设大家中标地滚动记录指针到我们要取的多少的开头的那一行,然后我们把那一行的记录的ID字段的值记录下来,那么,利用Top和条件,大家就非常轻便的得到钦命页的数目了。当然,有了Set
RowCount,大家难道还用Top么? 看看Set Rowcount怎么来帮大家的忙啊: 复制代码 代码如下: Declare @ID int Declare
@MoveRecords int –@CurrentPage和@PageSize是流传参数 Set
@MoveRecords=@CurrentPage * @PageSize+1
–下边两行达成快捷轮转到我们要取的数据的行,并把ID记录下来 Set Rowcount
@MoveRecords Select @ID=ID from Table1 Order by ID Set Rowcount
@PageSize –最恨为了减小麻烦使用*了,可是在这里边为了评释方便,一时用一下
Select * From Table1 Where ID=@ID Order By ID Set Rowcount 0
大家可以试试看,在贰个1千W记录的表里面,一下子方翻页到第100页,看看有多快!
因为平日 倒序 排的比非常多,上边也很好改。 将 Order by ID 改成 Order by ID
DESC 将 Where ID=@ID Order By ID 改成 Where ID=@ID Order By ID DESC
就能够了. 复制代码 代码如下: set
ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO Create PROCEDURE
[dbo].[Tag_Page_Name_Select] — 传入最大展现纪录数和脚下页码
@MaxPageSize int, @PageNum int, —
设置二个出口参数再次回到总纪录数供分页列表使用 @Count int output AS BEGIN
SET NOCOUNT ON; DECLARE — 定义排序名称参数 @Name nvarchar(50State of Qatar, —
定义游标地点 @Cursor int — 首先取得纪录总量 Select @Count =
count(tag_Name) FROM [viewdatabase0716].[dbo].[view_tag]; —
定义游标供给最早的职责 Set @Cursor = @MaxPageSize*(@PageNum-1卡塔尔(قطر‎+1 —
借使游标大于纪录总的数量将游标放到最终一页早先的岗位 IF @Cursor @Count BEGIN
— 要是最终一页与最大每一趟纪录数相等,重返最终整页 IF @Count %
@MaxPageSize = 0 BEGIN IF @Cursor @MaxPageSize Set @Cursor = @Count –
@MaxPageSize + 1 ELSE Set @Cursor = 1 END — 再不再次回到最终一页剩下的记录
ELSE Set @Cursor = @Count – (@Count % @MaxPageSize卡塔尔(قطر‎ + 1 END —
将指针指到该页初始 Set Rowcount @Cursor — 获得纪录伊始的职位 Select
@Name = tag_Name FROM [viewdatabase0716].[dbo].[view_tag] orDER
BY tag_Name; — 设置最初地方 Set Rowcount @MaxPageSize — 得到该页纪录
Select * From [viewdatabase0716].[dbo].[view_tag] Where
tag_Name = @Name order By tag_Name Set Rowcount 0 END 分页控件 复制代码 代码如下: using System.Data; using
System.Configuration; using System.Web; using System.Web.Security; using
System.Web.UI; using System.Web.UI.WebControls; using
System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls;
using System.Text; /// summary /// 扩充连接字符串 /// /summary public
class ExStringBuilder { private StringBuilder InsertString; private
StringBuilder PageString; private int PrivatePageNum = 1; private int
PrivateMaxPageSize = 25; private int PrivateMaxPages = 10; private int
PrivateCount; private int PrivateAllPage; public ExStringBuilder(卡塔尔 {
InsertString = new StringBuilder(“”卡塔尔(قطر‎; } /// summary /// 获得扭转的HTML
/// /summary public string GetHtml { get { return
InsertString.ToString(卡塔尔国; } } /// summary /// 取得扭转的分页HTML ///
/summary public string GetPageHtml { get { return PageString.ToString(卡塔尔;
} } /// summary /// 设置或获得近年来页数 /// /summary public int PageNum {
get { return PrivatePageNum; } set { if (value = 1State of Qatar { PrivatePageNum =
value; } } } /// summary /// 设置或得到最大分页数 /// /summary public
int MaxPageSize { get { return Private马克斯PageSize; } set { if (value =
1卡塔尔(قطر‎ { PrivateMaxPageSize = value; } } } /// summary ///
设置或得到每一趟彰显最大页数 /// /summary public int MaxPages { get {
return PrivateMaxPages; } set { PrivateMaxPages = value; } } /// summary
/// 设置或获取数据总量 /// /summary public int DateCount { get { return
PrivateCount; } set { PrivateCount = value; } } /// summary ///
获取数据总页数 /// /summary public int AllPage { get { return
PrivateAllPage; } } /// summary /// 开始化分页 /// /summary public void
Pagination(卡塔尔国 { PageString = new StringBuilder(“”卡塔尔; //获得总页数
PrivateAllPage = (intState of QatarMath.Ceiling((decimal卡塔尔PrivateCount /
(decimal卡塔尔(قطر‎PrivateMaxPageSize卡塔尔(قطر‎; //幸免上标或下标越界 if (PrivatePageNum
PrivateAllPageState of Qatar { PrivatePageNum = PrivateAllPage; } //滚动游标分页方式int LeftRange, RightRange, LeftStart, RightEnd; LeftRange =
(PrivateMaxPages + 1State of Qatar / 2-1; RightRange = (PrivateMaxPages + 1卡塔尔(قطر‎ / 2; if
(PrivateMaxPages = PrivateAllPage卡塔尔 { LeftStart = 1; RightEnd =
PrivateAllPage; } else { if (PrivatePageNum = LeftRange卡塔尔国 { LeftStart =
1; RightEnd = LeftStart + PrivateMaxPages – 1; } else if (PrivateAllPage

因为有对象问起,使用ASPNETPager怎么样进行有查询条件的分页,特意写个测量试验例子给我们.只供普通程序猿参照他事他说加以考查

SQL Server中有一个Set Rowcount的的设置,它的情致是职分令的拍卖在响应钦定的行数之后甘休管理命令,利用这几个特点,我们能够借用它来在叁个万万行级数据表中实现高品质分页查询。先来讲讲完成情势: 
      1、大家来假定Table中有二个早已成立了目录的主键字段ID(整数型),大家将依据那些字段来取数据进行分页。 
      2、页的尺寸大家坐落于@PageSize中 
      3、当前页号大家坐落于@CurrentPage中 
      4、如何让记录指针神速轮转到大家要取的数额开头的那一行呢,那是关键所在!有了Set RowCount,大家就相当的轻巧达成了。 
      5、假如大家中标地滚动记录指针到大家要取的多寡的发端的那一行,然后大家把那一行的笔录的ID字段的值记录下来,那么,利用Top和原则,我们就非常轻松的拿走内定页的数目了。当然,有了Set RowCount,大家难道还用Top么? 
      看看Set Rowcount怎么来帮我们的忙啊: 
 
 
Declare @ID int 
Declare @MoveRecords int 
 
–@CurrentPage和@PageSize是流传参数 
Set @MoveRecords=@CurrentPage * @PageSize+1 
 
–上边两行达成长足轮转到大家要取的数据的行,并把ID记录下来 
Set Rowcount @MoveRecords 
Select @ID=ID from Table1 Order by ID 
 
Set Rowcount @PageSize 
–最恨为了减小麻烦使用*了,不过在这间为了评释方便,一时用一下 
Select * From Table1 Where ID>=@ID Order By ID 
Set Rowcount 0 
 
      大家能够实施看,在三个1千W记录的表里面,一下子方翻页到第100页(每页100条),看看有多快! 
 
因为经常 倒序 排的可比多,上边也很好改。  
将 Order by ID 改成 Order by ID DESC  
将 Where ID>=@ID Order By ID 改成 Where ID<=@ID Order By ID DESC  
就能够了. 

  • PrivatePageNum RightRange卡塔尔(قطر‎ { RightEnd = PrivateAllPage; LeftStart =
    RightEnd – PrivateMaxPages + 1; } else { LeftStart = PrivatePageNum –
    LeftRange; RightEnd = PrivatePageNum + RightRange; } }
    //生成页码列表总结 PageString.Append(…卡塔尔国; StringBuilder PreviousString
    = new StringBuilder(“”State of Qatar; //如若在首先页 if (PrivatePageNum 1卡塔尔国 { … }
    else { … } //倘使在第一组分页 if (PrivatePageNum PrivateMaxPages卡塔尔国 {
    … } else { … } PageString.Append(PreviousString卡塔尔(قطر‎; //生成中间页 for
    (int i = LeftStart; i = RightEnd; i++State of Qatar { //为当前页时 if (i ==
    PrivatePageNumState of Qatar { … } else { … } } StringBuilder LastString = new
    StringBuilder(“”卡塔尔国; //如若在最后一页 if (PrivatePageNum PrivateAllPageState of Qatar {
    … } else { … } //即使在结尾一组 if ((PrivatePageNum +
    PrivateMaxPagesState of Qatar PrivateAllPage卡塔尔(قطر‎ { … } else { … }
    PageString.Append(LastString卡塔尔国; } /// summary /// 生成Tag分类表格 ///
    /summary public void TagTable(ExDataRow myExDataRow卡塔尔 {
    InsertString.Append(…卡塔尔(قطر‎; } 调用艺术: //取得分页设置并归入Session
    ExRequest myExRequest = new ExRequest(卡塔尔(قطر‎;
    myExRequest.PageSession(“Tag_”, new string[] { “page”, “size” }卡塔尔;
    //生成Tag分页 ExStringBuilder Tag = new ExStringBuilder(卡塔尔(قطر‎;
    //设置每一趟显示多少条纪录 Tag.MaxPageSize =
    Convert.ToInt32(Session[“Tag_size”]卡塔尔(قطر‎; //设置最多显示多少页码
    Tag.MaxPages = 9; //设置当前为第几页 Tag.PageNum =
    Convert.ToInt32(Session[“Tag_page”]); string[][] myNamenValue =
    new string[2][]{ new string[]{“MaxPageSize”,”PageNum”,”Count”},
    new string[]{Tag.马克斯PageSize.ToString(卡塔尔(قطر‎,Tag.PageNum.ToString(State of Qatar} };
    //调用存款和储蓄进程 DataTable myDataTable =
    mySQL.BatchGetDB(“Tag_Page_Name_Select”, myNamenValue, “Count”);
    Tag.DateCount = (int)mySQL.OutputCommand.Parameters[“@Count”].Value;
    Tag.Pagination(); HeadPage.InnerHtml = FootPage.InnerHtml =
    Tag.GetPageHtml; for (int i = 0, j = myDataTable.Rows.Count; i j; i++) {
    Tag.TagTable(new ExDataRow(myDataTable.Rows[i])); } TagBox.InnerHtml =
    Tag.GetHtml;

 

WebPage

 

<%@ Page Language=”C#” AutoEventWireup=”true”
CodeFile=”Default2.aspx.cs” Inherits=”Default2″ %>
<%@ Register Assembly=”AspNetPager” Namespace=”Wuqi.Webdiyer”
TagPrefix=”webdiyer” %>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“;

<html xmlns=”” >
<head runat=”server”>
    <title>无标题页</title>
</head>
<body>
    <form id=”form1″ runat=”server”>
    <div>
    <a href =”/a/1.aspx”>abc</a>
        <asp:Button ID=”Button1″ runat=”server”
OnClick=”Button1_Click” Text=”Button” />
        <asp:Button ID=”Button2″ runat=”server”
OnClick=”Button2_Click” Text=”Button” />
        <asp:TextBox ID=”TextBox1″
runat=”server”></asp:TextBox>
        <asp:Button ID=”btns” runat=”server” OnClick=”btns_Click”
Text=”search” /><br />
        <asp:Label ID=”lblnewstype”
runat=”server”></asp:Label><br />
        <br />
        <br />
        <br />
        <asp:Label ID=”lblContent”
runat=”server”></asp:Label><br />
        <br />
        <asp:GridView ID=”GridView1″ runat=”server”>
        </asp:GridView>
        <asp:Button ID=”Button3″ runat=”server”
OnClick=”Button3_Click” Text=”Button” />
        <webdiyer:AspNetPager ID=”AspNetPager1″ runat=”server”
OnPageChanging=”AspNetPager1_PageChanging”>
                                               
</webdiyer:AspNetPager>
        </div>
    </form>
</body>
</html>