ASP.NET开发技巧精讲
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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页