- ASP.NET开发技巧精讲
- 黄鸣
- 873字
- 2025-02-22 23:06:35
2.8 GridView结合Webdiyer以及分页通用存储过程海量数据分页
前面说的分页其实在数据量小的时候问题不大,如果有海量数据,那么一次select所有的数据无疑是很不合理的一件事,所以就要每次只取当前页的数据即可,很多人都是使用“存储过程+分页控件”就可以完成,原理是用存储过程先算出数据库中的总行数,然后每次传当前取第几到第几行即可。
本书推荐的分页控件由Webdiyer所写,网名陕北吴起娃,在百度搜索Webdiyer第一个就是,大家从http://www.webdiyer.com可以看到该控件的很多详细介绍,从下载页面:www.webdiyer.com/download/default.aspx下载最新的DLL和例子AspNetPager72Samples即可。Webdiyer控件的功能很多,这里不一一叙述,仅介绍其最简单的分页功能。
第一,在你的项目中引用AspNetPager.dll,如图2-21、图2-22所示。

图2-21 单击“添加引用”命令

图2-22 在bin目录中选择AspNetPager.dll引用
第二,在web.config的<pages><controls>中注册该控件,代码如下所示。
<pages> <controls> <addtagPrefix="asp"namespace="System.Web.UI"assembly="System.Web.Extensio ns, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/> <addtagPrefix="asp"namespace="System.Web.UI.WebControls"assembly= "System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken= 31BF3856AD364E35"/> <addtagPrefix="webdiyer"namespace="Wuqi.Webdiyer"assembly="AspNetPager"/> </controls> </pages>
第三,添加SqlHelper.cs类库文件,这个文件可以从Webdiyer例子AspNetPager72Samples中找到,当然如果你把SqlHelper.cs用得很熟就会知道这个是微软公开的一个数据访问类库,Webdiyer使用的SqlHelper.cs已经把原SqlHelper.cs精简很多。注意修改SqlHelper.cs中的数据库连接信息CONN_STRING,为你的web.config配置的信息如下所示。
publicstaticreadonlystring CONN_STRING=ConfigurationManager. ConnectionStrings["SQLCONN"].ConnectionString;
第四,添加前台代码如下所示。
<asp:GridViewID="GridView1"runat="server"BackColor="White"BorderColor="#C CCCCC" BorderStyle="None"BorderWidth="1px"CellPadding="4"Font-Size="12px" ForeColor="Black"GridLines="Both"PageSize="5"> <FooterStyleBackColor="#CCCC99"ForeColor="Black"/> <PagerStyleBackColor="White"ForeColor="Black"HorizontalAlign="Right"/> <SelectedRowStyleBackColor="#CC3333"Font-Bold="True"ForeColor="White"/> <HeaderStyleBackColor="#333333"Font-Bold="True"ForeColor="White"/> </asp:GridView> <webdiyer:aspnetpagerid="AspNetPager1"runat="server" PagingButtonSpacing="8px"onpagechanged="AspNetPager1_PageChanged" showcustominfosection="Right" CustomInfoHTML="总记录数:%RecordCount%,总页数:%PageCount%,当前为第 %CurrentPageIndex%页" urlpaging="True"width="100%"LayoutType="Table"ShowNavigationToolTip="true" UrlPageIndexName="pageindex"Font-Size="12px"></webdiyer:aspnetpager>
第五,添加后台代码如下所示。
protectedvoid Page_Load(object sender, EventArgs e) { if (!IsPostBack) { bind(); } } //绑定 publicvoid bind() { //cache the number of total records to improve performance object obj=Cache[GetType() + "totalOrders"]; if (obj == null) { int totalOrders=(int)SqlHelper.ExecuteScalar(CommandType.StoredProcedure, "P_GetOrderNumber"); Cache[GetType() + "totalOrders"]=totalOrders; AspNetPager1.RecordCount=totalOrders; } else { AspNetPager1.RecordCount=(int)obj; } } protectedvoid AspNetPager1_PageChanged(object src, EventArgs e) { GridView1.DataSource=SqlHelper.ExecuteReader(CommandType. StoredProcedure, "P_GetPagedOrders2005", newSqlParameter("@startIndex", AspNetPager1.StartRecordIndex), newSqlParameter("@endIndex", AspNetPager1.EndRecordIndex)); GridView1.DataBind(); }
第六,添加分页通用存储过程。
第一个存储过程:
setANSI_NULLSON setQUOTED_IDENTIFIERON go --分页存储过程计算行数 ALTERPROCEDURE [dbo].[P_GetOrderNumber] AS selectcount(*)from章立民工作室; RETURN
第二个存储过程:
setANSI_NULLSON setQUOTED_IDENTIFIERON go --分页通用存储过程 ALTERPROCEDURE [dbo].[P_GetPagedOrders2005] (@startIndex INT, @endindex INT ) AS begin WITH章立民工作室AS( SELECT ROW_NUMBER()OVER(ORDERBY员工编号)AS Row,员工编号,身份证号码,姓名,性别,地址 from章立民工作室) SELECT员工编号,身份证号码,姓名,性别,地址 FROM章立民工作室 WHERE Row between @startIndex and @endIndex end
说明:这里使用了SQLServer 2005特有的WITH递归方法,关于这个可以参考本书第8章或者网络。
最终显示在网页中的效果如图2-23、图2-24所示。

图2-23 Webdiyer的AspNetPager分页控件第1页
总结:Webdiyer的AspNetPager分页控件还有许多功能,如果你有需要可以关注其网站。而且AspNetPager是完全免费且开放源代码的ASP.NET控件,可以被用于商业目的,唯一的条件是保留控件中的版权信息。所谓的版权信息是HTML代码中的信息:<!-- AspNetPager V7.2 for VS2005 & VS2008 Copyright:2003-2008 Webdiyer (www. webdiyer.com) -->,应该说这样的版权信息一点也不会影响使用,所以本书郑重推荐。

图2-24 Webdiyer的AspNetPager分页控件第2页