ASP.NET和MSSQL高性能分页

首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Clear
-- Description: 高性能分页
-- http://www.cnblogs.com/roucheng/
-- =============================================
Alter PROCEDURE [dbo].[Tag_Page_Name_Select]
-- 传入最大显示纪录数和当前页码
    @MaxPageSize int,
    @PageNum int,
-- 设置一个输出参数返回总纪录数供分页列表使用
    @Count int output
AS
BEGIN
    SET NOCOUNT ON;

  DECLARE
-- 定义排序名称参数
        @Name nvarchar(50),
-- 定义游标位置
        @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

  然后是分页控件(... 为省略的生成HTML代码方法):

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 >= 1)
            {
                PrivatePageNum = value;
            }
        }
    }
    /// <summary>
    /// 设置或获取最大分页数
    /// </summary>
    public int MaxPageSize
    {
        get
        {
            return PrivateMaxPageSize;
        }
        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 = (int)Math.Ceiling((decimal)PrivateCount / (decimal)PrivateMaxPageSize);
//防止上标或下标越界
        if (PrivatePageNum > PrivateAllPage)
        {
            PrivatePageNum = PrivateAllPage;
        }
//滚动游标分页方式
        int LeftRange, RightRange, LeftStart, RightEnd;
        LeftRange = (PrivateMaxPages + 1) / 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 - PrivatePageNum < RightRange)
            {
                RightEnd = PrivateAllPage;
                LeftStart = RightEnd - PrivateMaxPages + 1;
            }
            else
            {
                LeftStart = PrivatePageNum - LeftRange;
                RightEnd = PrivatePageNum + RightRange;
            }
        }

//生成页码列表统计
        PageString.Append(...);

        StringBuilder PreviousString = new StringBuilder("");
//如果在第一页
        if (PrivatePageNum > 1)
        {
            ...
        }
        else
        {
            ...
        }
//如果在第一组分页
        if (PrivatePageNum > PrivateMaxPages)
        {
            ...
        }
        else
        {
            ...
        }
        PageString.Append(PreviousString);
//生成中间页 http://www.cnblogs.com/roucheng/
        for (int i = LeftStart; i <= RightEnd; i++)
        {
//为当前页时
            if (i == PrivatePageNum)
            {
                ...
            }
            else
            {
                ...
            }
        }
        StringBuilder LastString = new StringBuilder("");
//如果在最后一页
        if (PrivatePageNum < PrivateAllPage)
        {
            ...
        }
        else
        {
            ...
        }
//如果在最后一组
        if ((PrivatePageNum + PrivateMaxPages) < 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.MaxPageSize.ToString(),Tag.PageNum.ToString()}
        };
//调用存储过程
        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));
        }
        TagBox.InnerHtml = Tag.GetHtml;

  

时间: 2024-10-11 04:32:22

ASP.NET和MSSQL高性能分页的相关文章

ASP.NET MVC 简单的分页思想与实现

, 作为一个程序猿,数据分页是每个人都会遇到的问题.解决方案更是琳琅满目,花样百出.但基本的思想都是差不多的. 下面给大家分享一个简单的分页器,让初学者了解一下最简单的分页思想,以及在ASP.NET MVC中的简单实现与应用. 一,定义分页器类 在ASP.net MVC中,分页的数据源可能是各种不同的类型,所以最好使用泛型来定义. public class PagingHelper<T> 二,基本三要素 实现分页人所共知的三个基本属性: DataSource:数据源,要知道数据源共计多少条数据

ASP.NET MVC- 使用PageList.Mvc分页

ASP.NET MVC中进行分页的方式有多种,在NuGet上有提供使用PagedList.PagedList.Mvc进行分页. 1. 通过NuGet引用PagedList.Mvc 在安装引用PagedList.Mvc的同时会安装引用PagedList. 1.看一下Controller页面的代码,最后就简单的一句,将List数据ToPagedList返回过去就可以了.原来爱怎么分页可以怎么分页. //引用 using PagedList; namespace MvcApplication1.Con

mssql Row_Number() 分页 DISTINCT 问题

转载原文地址http://www.cnblogs.com/pumaboyd/archive/2008/04/20/1162376.html 这周碰到了很多奇怪的问题,有些是莫名的低级错误,有些这是一直以来未发现的错误.其中这个RowNumber()这个问题就是这样. 敬德兄写的底层负责自动生成T-SQL.当我需求对数据DISTINCT的时候就发现RowNuber() 和DISTINCT是有冲突的. WITH ListOrder AS(SELECT DISTINCT A.*,ROW_NUMBER(

mssql数据库分页查询效率的一次体会

这几天在一个项目,合同管理系统(是对老系统的升级和改造,老系统是VS2008做的),由于数据库的表是项目组根据老系统的数据库建的,所以在查询的适合我就需要自己创建视图来完成多表的查询,起初我是读取项目组成员建好的视图,里面有7张表,其中还包含视图,由于视图中join视图是不支持索引的,所以在查询第一页的时候(每一页20条数据,总共数据量是10W条左右),耗时800毫秒,但是 当row_number达到上千的时候,基本查询要6秒以上,每点击下一页,耗时会增加十几毫秒,到40000条也就是中间的时候

asp.net GridView 表格之分页显示与翻页功能及自定义翻页页码样式

一.实现分页功能  GridView实现分页只需要在属性框中将AllowPaging(是否在GridView中打开分页功能)设置为true即可 有时打开分页后不显示页码 确保AllowCustomPaging(是否打开对自定义分页的支持)为False即可 二.实现翻页功能  如何点击页码实现翻页呢? 在属性框中事件选择设置PageIndexChanging(在Grid View的当前索引页正在更改事触发)这一事件 后台代码如下 /// <summary> /// 翻页操作 /// 在GridV

ASP.NET中实现Ajax分页

在页面中指定一个div容器来接收动态生成的分页数据: 1 <div id="div_menu"> 2 </div> 使用jQuery来请求并处理Json格式数据: 1 //定义页码与页容量 2 var pageIndex = 1; 3 var pageSize = 15; 4 var pageCount = 0; 5 var recordCount = 0; 6 AjaxGetData(pageIndex, pageSize); 7 //Ajax获取数据 8 f

ASP.NET MVC利用PagedList分页(二)PagedList+Ajax+JsRender

(原文) 昨天在ASP.NET MVC利用PagedList分页(一)的 最后一节提到,一个好的用户体验绝对不可能是点击下一页后刷新页面,所以今天来说说利用Ajax+PagedList实现无刷新(个人绝对局部刷新更准确 些)的分页.其实在PagedList.Mvc中早已经为我们提供好了Ajax分页的各种东东,但是这里我要自己写下. 实现思想: 1.客户端发送Ajax请求.2.服务器端响应请求并将响应结果回传给客户端.3.客户端接收响应结果并进行数据绑定. 实现方案: 大多数人都知道这个思想,但是

asp.net实现access数据库分页

最近在编程人生上看到篇文章很有感触,觉得人生还是要多奋斗.今天给大家贡献点干货. <divclass="page"id="ctrlRecordPage"> 总<asp:LabelID="Zpage"runat="server"Text="1"></asp:Label>页/ <asp:LabelID="Zcount"runat="serv

asp.net mvc easyui datagrid分页

提到 asp.net mvc 中的分页,很多是在用aspnetpager,和easyui datagrid结合的分页却不多,本文介绍的是利用easyui 中默认的分页控件,实现asp.net mvc分页. easyui datagrid分页要求数据采用的格式 :{total:2,row:[]}, 在asp.net mvc 中服务器端只要返回这符合这样格式的json数据就好. 页面前端: 服务器端: 附带asp.net 结合 easyui 增删改查的例子: asp.net mvc easyui d