ASP.NET和MSSQL高性能分页实例代码
首先是存储过程,只取出我需要的那段数据,如果页数超过数据总数,自动返回最后一页的纪录:
setANSI_NULLSON setQUOTED_IDENTIFIERON GO --============================================= --Author:Clear --Description:高性能分页 --http://www.cnblogs.com/roucheng/ --============================================= AlterPROCEDURE[dbo].[Tag_Page_Name_Select] --传入最大显示纪录数和当前页码 @MaxPageSizeint, @PageNumint, --设置一个输出参数返回总纪录数供分页列表使用 @Countintoutput AS BEGIN SETNOCOUNTON; DECLARE --定义排序名称参数 @Namenvarchar(50), --定义游标位置 @Cursorint --首先得到纪录总数 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 --将指针指到该页开始 SetRowcount@Cursor --得到纪录开始的位置 Select@Name=tag_Name FROM[viewdatabase0716].[dbo].[view_tag] orDERBYtag_Name; --设置开始位置 SetRowcount@MaxPageSize --得到该页纪录 Select* From[viewdatabase0716].[dbo].[view_tag] Wheretag_Name>=@Name orderBytag_Name SetRowcount0 END
然后是分页控件(...为省略的生成HTML代码方法):
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Text;
///<summary>
///扩展连接字符串
///</summary>
publicclassExStringBuilder
{
privateStringBuilderInsertString;
privateStringBuilderPageString;
privateintPrivatePageNum=1;
privateintPrivateMaxPageSize=25;
privateintPrivateMaxPages=10;
privateintPrivateCount;
privateintPrivateAllPage;
publicExStringBuilder()
{
InsertString=newStringBuilder("");
}
///<summary>
///得到生成的HTML
///</summary>
publicstringGetHtml
{
get
{
returnInsertString.ToString();
}
}
///<summary>
///得到生成的分页HTML
///</summary>
publicstringGetPageHtml
{
get
{
returnPageString.ToString();
}
}
///<summary>
///设置或获取目前页数
///</summary>
publicintPageNum
{
get
{
returnPrivatePageNum;
}
set
{
if(value>=1)
{
PrivatePageNum=value;
}
}
}
///<summary>
///设置或获取最大分页数
///</summary>
publicintMaxPageSize
{
get
{
returnPrivateMaxPageSize;
}
set
{
if(value>=1)
{
PrivateMaxPageSize=value;
}
}
}
///<summary>
///设置或获取每次显示最大页数
///</summary>
publicintMaxPages
{
get
{
returnPrivateMaxPages;
}
set
{
PrivateMaxPages=value;
}
}
///<summary>
///设置或获取数据总数
///</summary>
publicintDateCount
{
get
{
returnPrivateCount;
}
set
{
PrivateCount=value;
}
}
///<summary>
///获取数据总页数
///</summary>
publicintAllPage
{
get
{
returnPrivateAllPage;
}
}
///<summary>
///初始化分页
///</summary>
publicvoidPagination()
{
PageString=newStringBuilder("");
//得到总页数
PrivateAllPage=(int)Math.Ceiling((decimal)PrivateCount/(decimal)PrivateMaxPageSize);
//防止上标或下标越界
if(PrivatePageNum>PrivateAllPage)
{
PrivatePageNum=PrivateAllPage;
}
//滚动游标分页方式
intLeftRange,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;
}
elseif(PrivateAllPage-PrivatePageNum<RightRange)
{
RightEnd=PrivateAllPage;
LeftStart=RightEnd-PrivateMaxPages+1;
}
else
{
LeftStart=PrivatePageNum-LeftRange;
RightEnd=PrivatePageNum+RightRange;
}
}
//生成页码列表统计
PageString.Append(...);
StringBuilderPreviousString=newStringBuilder("");
//如果在第一页
if(PrivatePageNum>1)
{
...
}
else
{
...
}
//如果在第一组分页
if(PrivatePageNum>PrivateMaxPages)
{
...
}
else
{
...
}
PageString.Append(PreviousString);
//生成中间页http://www.cnblogs.com/roucheng/
for(inti=LeftStart;i<=RightEnd;i++)
{
//为当前页时
if(i==PrivatePageNum)
{
...
}
else
{
...
}
}
StringBuilderLastString=newStringBuilder("");
//如果在最后一页
if(PrivatePageNum<PrivateAllPage)
{
...
}
else
{
...
}
//如果在最后一组
if((PrivatePageNum+PrivateMaxPages)<PrivateAllPage)
{
...
}
else
{
...
}
PageString.Append(LastString);
}
///<summary>
///生成Tag分类表格
///</summary>
publicvoidTagTable(ExDataRowmyExDataRow)
{
InsertString.Append(...);
}
调用方法:
//得到分页设置并放入Session
ExRequestmyExRequest=newExRequest();
myExRequest.PageSession("Tag_",newstring[]{"page","size"});
//生成Tag分页
ExStringBuilderTag=newExStringBuilder();
//设置每次显示多少条纪录
Tag.MaxPageSize=Convert.ToInt32(Session["Tag_size"]);
//设置最多显示多少页码
Tag.MaxPages=9;
//设置当前为第几页
Tag.PageNum=Convert.ToInt32(Session["Tag_page"]);
string[][]myNamenValue=newstring[2][]{
newstring[]{"MaxPageSize","PageNum","Count"},
newstring[]{Tag.MaxPageSize.ToString(),Tag.PageNum.ToString()}
};
//调用存储过程
DataTablemyDataTable=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(inti=0,j=myDataTable.Rows.Count;i<j;i++)
{
Tag.TagTable(newExDataRow(myDataTable.Rows));
}
TagBox.InnerHtml=Tag.GetHtml;