ASP.NET 高性能分页代码

最近给分页快搞死,记得之前曾经发过修改dw asp分页的方法,后来又写过手工打造的asp分页,现在进入.net当然要配合存储过程打造纯手工高性能分页了. 

为什么会叫做高性能,为什么要手工打造,不使用.net现有的分页控件呢?这个还要追溯到我修改dw asp分页的时候,那个我还不怎么懂程序这个东西,只会修修补补,就更不要去谈什么性能问题.当时改的很心烦,接着叫我的私人技术总监张总帮我看看,当时张总就以一种不屑一顾的眼神往着我,说了句话:值得吗? 

接着到我手工打造asp分页,又搞不下去了,张总丢给我一堆.net的代码:自己研究吧.然后又丢了一句话:用.net做吧,几句话搞定,不用这个费神. 

后来我发现以前的分页都是把整个数据集全部读取后再做分页处理的,一旦数据量过大,处理会十分缓慢,甚至服务器崩溃.然后就是以前的分页不能象游标一样滚动,总是固定在一组里面,不可能实现当前页码在中间的效果. 

接着就要说.net的分页控件了,确实几句话可以搞定,不过缺陷就是我发现的第一个问题,属于把数据全部读出再处理的那种,没有效率,所以终于开始动手,纯手工打造asp.net高性能分页. 

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

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Clear -- Create date: 2007-01-30 -- Description: 高性能分页 -- ============================================= 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             Set @Cursor = @Count - @MaxPageSize + 1 -- 否则返回最后一页剩下的纪录         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; ///  /// 扩展连接字符串 ///  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("");     }     ///      /// 得到生成的HTML     ///      public string GetHtml     {         get         {             return InsertString.ToString();         }     }     ///      /// 得到生成的分页HTML     ///      public string GetPageHtml     {         get         {             return PageString.ToString();         }     }     ///      /// 设置或获取目前页数     ///      public int PageNum     {         get         {             return PrivatePageNum;         }         set         {             if (value >= 1)             {                 PrivatePageNum = value;             }         }     }     ///      /// 设置或获取最大分页数     ///      public int MaxPageSize     {         get         {             return PrivateMaxPageSize;         }         set         {             if (value >= 1)             {                 PrivateMaxPageSize = value;             }         }     }     ///      /// 设置或获取每次显示最大页数     ///      public int MaxPages     {         get         {             return PrivateMaxPages;         }         set         {             PrivateMaxPages = value;         }     }     ///      /// 设置或获取数据总数     ///      public int DateCount     {         get         {             return PrivateCount;         }         set         {             PrivateCount = value;         }     }     ///      /// 获取数据总页数     ///      public int AllPage     {         get         {             return PrivateAllPage;         }     }     ///      /// 初始化分页     ///      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  1)         {             ...         }         else         {             ...         } //如果在第一组分页         if (PrivatePageNum > PrivateMaxPages)         {             ...         }         else         {             ...         }         PageString.Append(PreviousString); //生成中间页         for (int i = LeftStart; i      /// 生成Tag分类表格     ///      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 

处理页码到Session的方法就不提供了,没有很大关.调用存储过程返回参数和纪录的方法和之前我写的批量数据操作方法差不多的,只需要定义一个输出方式. 

目前我想这些代码还会有瑕疵,等项目后期代码审查的时候再强化吧,我想说的一点就是不要被那些拖来拖去的东西迷惑了,那样对自己永远都没有提高,要抱着知其然,知其所以然的态度去做一件事情,对自己的帮助才会明显. 

更多ASP.NET 高性能分页代码相关文章请关注PHP中文网!

登录后复制

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2552971.html

(0)
上一篇 2025年3月6日 06:37:31
下一篇 2025年3月6日 06:37:36

AD推荐 黄金广告位招租... 更多推荐

发表回复

登录后才能评论