在网上也看了不少的关于分页的文章,大多可以归纳为一下几类,第一:纯存储过程分页,大多语句非常繁琐,维护起来也很麻烦;第二:用.net的PagedDataSource分页,这中分页操作起来比较简单,但是只适合小数据量,一旦数据量上了十万,百万的这种分页方式已经不在适合;第三:用Viewdata传参进行分页,这种分页方式看上去效率还是可以,但是稳定太差。当然还有其他的分页方式,我在这里就不在一一列举,下面我就谈谈自己的分页方式。
闲来无事,来研究研究.net的分页技术。
在网上也看了不少的关于分页的文章,大多可以归纳为一下几类,第一:纯存储过程分页,大多语句非常繁琐,维护起来也很麻烦;第二:用.net的PagedDataSource分页,这中分页操作起来比较简单,但是只适合小数据量,一旦数据量上了十万,百万的这种分页方式已经不在适合;第三:用Viewdata传参进行分页,这种分页方式看上去效率还是可以,但是稳定太差。当然还有其他的分页方式,我在这里就不在一一列举,下面我就谈谈自己的分页方式。
首先让我们先来了解一下AspNetPager是个什么东东,可能会有N多人已经认识了并且用过了这个控件,但是这里我还是希望你能耐心的继续听下去,AspNetPager针对ASP.NET分页控件的不足,提出了与众不同的解决asp.net中分页问题的方案,即将分页导航功能与数据显示功能完全独立开来,由用户自己控制数据的获取及显示方式,因此可以被灵活地应用于任何需要实现分页导航功能的地方,如为GridView、DataList以及Repeater等数据绑定控件实现分页、呈现自定义的分页数据以及制作图片浏览程序等,因为AspNetPager控件和数据是独立的,因此要分页的数据可以来自任何数据源,如SQL Server、Oracle、Access、mysql、DB2等数据库以及XML文件、内存数据或缓存中的数据、文件系统等等,下面我将用我的实例来为你讲解AspNetPager结合sqlserver2005实现的分页过程。
首先要在项目里面引用一下AspNetPager.dll(没有的可以到这里下载http://www.webdiyer.com ),下面是我的aspx页面代码:
Code
<webdiyer:AspNetPager ID="AspNetPager1" runat="server" Width="100%" UrlPaging="true" ShowPageIndexBox="Always" PageIndexBoxType="DropDownList" TextBeforePageIndexBox="Go To Page: " HorizontalAlign="right" PageSize="12" OnPageChanged="AspNetPager1_PageChanged" EnableTheming="true">
</webdiyer:AspNetPager>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table width="100%" border="1" cellspacing="0" cellpadding="4" style="border-collapse:collapse">
<tr style="backGround-color:#CCCCFF"><th style="width:15%">IP编号</th><th style="width:15%">IP开始段</th><th style="width:30%">IP结束段</th><th style="width:20%">归属地</th><th style="width:20%">操作</th></tr>
</HeaderTemplate>
<ItemTemplate>
<tr style="background-color:#FAF3DC">
<td><%# Eval("IPid")%></td>
<td><%# Eval("IPFrom")%></td>
<td><%# Eval("IPTo")%></td>
<td><%# Eval("IPLocation")%></td>
<td></td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr style="background-color:#eaeaea">
<td><%# Eval("IPid")%></td>
<td><%# Eval("IPFrom")%></td>
<td><%# Eval("IPTo")%></td>
<td><%# Eval("IPLocation")%></td>
<td></td>
</tr>
</AlternatingItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<webdiyer:AspNetPager ID="AspNetPager2" runat="server" CloneFrom="AspNetPager1">
</webdiyer:AspNetPager>
注意引用AspNetPager.dll,要在你的分页页面上添加<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>,这里我要对我的IPInfo表进行分页,数据有40W条,应该不算小吧,那么接着看我们应该写一个分页存储过程,这里的存储过程是使用微软在MS SQL2005才加上去的ROW_NUMBER函数来写,这将会大大减少存储过程代码。
Code
Create PROCEDURE [dbo].[P_GetPagedOrders2005]
(@startIndex INT,
@endindex INT
)
AS
select * from (SELECT ROW_NUMBER() OVER(ORDER BY IPid DESC) AS rownum,
[IPid],[IPFrom],[IPTo],[IPLocation],[IPCity],[IPToNumber],[IPFromNumber] from IPInfo) as U
WHERE rownum between @startIndex and @endIndex
GO
这个存储过程需要连个参数@startIndex,@endindex,大家可以看到这个存储过程有多短,而且多么易读。下面我们来看看后台的代码:
Code
public partial class PagedRepeater_Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
int totalOrders = (int)SqlHelper.ExecuteScalar(CommandType.StoredProcedure, "P_GetOrderNumber");
AspNetPager1.RecordCount = totalOrders;
bindData();
}
}
void bindData()
{
Repeater1.DataSource = SqlHelper.ExecuteReader(CommandType.StoredProcedure, ConfigurationManager.AppSettings["pagedSPName"],
new SqlParameter("@startIndex", AspNetPager1.StartRecordIndex),
new SqlParameter("@endIndex", AspNetPager1.EndRecordIndex));
Repeater1.DataBind();
}
protected void AspNetPager1_PageChanged(object src, EventArgs e)
{
bindData();
}
}
看到这里相信你已经彻底的知道了AspNetPager分页的用法,当然还有就是再看看使用AspNetPager分页的外观是什么这样的,当然外观是可以选择的,你甚至在理解了AspNetPager的工作原理之后(可以自己去反编译AspNetPager.dll文件)可以自己对其中的方法进行更改,家点自己风格进去未尝不可。
这就是当前的效果图,查询速度也是非常的快,有兴趣的朋友可以尝试一下.