asp.net(C#)海量数据表高效率分页算法(易懂,不使用存储过程)[转]

首先创建一张表(要求ID自动编号):
                  create table redheadedfile(
                  id int identity(1,1),
                  filenames nvarchar(20),
                  senduser nvarchar(20),
                  primary key(id)
                  )
                  然后我们写入50万条记录:
                  declare @i int
                  set @i=1
                  while @i<=500000
                  begin
                      insert into redheadedfile(filenames,senduser)
                  values(’我的分页算法’,’陆俊铭’)
                      set @i=@i+1
                  end
                  GO
                  用Microsoft Visual Studio .NET
                  2003创建一张WebForm网页(本人起名webform8.aspx)
                  前台代码片段如下(webform8.aspx):
                  <%@ Page language="c#" Codebehind="WebForm8.aspx.cs"
                  AutoEventWireup="false" Inherits="WebApplication6.WebForm8" %>

                  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
                  >
                  <HTML>
                   <HEAD>
                    <title>WebForm8</title>
                    <meta content="Microsoft Visual Studio .NET 7.1"
                  >
                    <meta content="C#" >
                    <meta content="JavaScript" >
                    <meta
                  content="http://schemas.microsoft.com/intellisense/ie5"
                  >
                   </HEAD>
                   <body MS_POSITIONING="GridLayout">
                    <form method="post" runat="server">
                     <asp:datalist
                  AlternatingItemStyle-BackColor="#f3f3f3" Width="100%"
                  CellSpacing="0"
                      CellPadding="0" Runat="server">
                      <ItemTemplate>
                       <table width="100%" border="0" cellspacing="0"
                  cellpadding="0">
                        <tr>
                         <td width="30%" 

                  align="center"><%#DataBinder.Eval(Container.DataItem,"filenames")%></td>

                         <td width="30%" 

                  align="center"><%#DataBinder.Eval(Container.DataItem,"senduser")%></td>

                         <td width="30%" 

                  align="center"><%#DataBinder.Eval(Container.DataItem,"id")%></td>

                        </tr>
                       </table>
                      </ItemTemplate>
                     </asp:datalist>
                     <div align="center">共<asp:label
                  Runat="server" ForeColor="#ff0000"></asp:label>页/共

                  <asp:label Runat="server"
                  ForeColor="#ff0000"></asp:label>记录
                      <asp:linkbutton Runat="server" 

                  CommandName="0">首页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;<asp:linkbutton
                  Runat="server" CommandName="prev">

                  上一页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;<asp:linkbutton
                  Runat="server" 

                  CommandName="next">下一页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;<asp:linkbutton
                  Runat="server" 

                  CommandName="last">尾页</asp:linkbutton>&nbsp;&nbsp;&nbsp;&nbsp;当前第<asp:label
                  Runat="server" 

                  ForeColor="#ff0000"></asp:label>页&nbsp;&nbsp;&nbsp;&nbsp;跳页<asp:TextBox
                  Runat="server" Width="30px" 

                  MaxLength="5" AutoPostBack="True"></asp:TextBox></div>
                    </form>
                   </body>
                  </HTML>
                  后台代码片段如下(webform8.aspx.cs)
                  using System;
                  using System.Collections;
                  using System.ComponentModel;
                  using System.Data;
                  using System.Drawing;
                  using System.Web;
                  using System.Web.SessionState;
                  using System.Web.UI;
                  using System.Web.UI.WebControls;
                  using System.Web.UI.HtmlControls;
                  using System.Data.SqlClient;
                  using System.Configuration;
                  namespace WebApplication6
                  {
                   /// <summary>
                   /// WebForm8 的摘要说明。
                   /// </summary>
                   public class WebForm8 : System.Web.UI.Page
                   {
                    protected System.Web.UI.WebControls.LinkButton Fistpage;
                    protected System.Web.UI.WebControls.LinkButton Prevpage;
                    protected System.Web.UI.WebControls.LinkButton Nextpage;
                    protected System.Web.UI.WebControls.LinkButton Lastpage;
                    protected System.Web.UI.WebControls.DataList datalist1;
                    protected System.Web.UI.WebControls.DropDownList mydroplist;

                    protected System.Web.UI.WebControls.Label LPageCount;
                    protected System.Web.UI.WebControls.Label LRecordCount;
                    protected System.Web.UI.WebControls.Label LCurrentPage;
                    protected System.Web.UI.WebControls.TextBox gotoPage;
                    const int PageSize=20;//定义每页显示记录
                    int
                  PageCount,RecCount,CurrentPage,Pages,JumpPage;//定义几个保存分页参数变量
                   
                    private void Page_Load(object sender, System.EventArgs e)
                    {
                     if(!IsPostBack)
                     {
                      RecCount = Calc();//通过Calc()函数获取总记录数
                      PageCount = RecCount/PageSize +
                  OverPage();//计算总页数(加上OverPage()函数防止有余数造成显示

                  数据不完整)

                      ViewState["PageCounts"] = RecCount/PageSize - 

                  ModPage();//保存总页参数到ViewState(减去ModPage()函数防止SQL语句执行时溢出查询范围,可以用存储过程分页算法来理解这句)

                      ViewState["PageIndex"] = 0;//保存一个为0的页面索引值到ViewState
                      ViewState["JumpPages"] =
                  PageCount;//保存PageCount到ViewState,跳页时判断用户输入数是否超出页

                  码范围
                      //显示LPageCount、LRecordCount的状态
                      LPageCount.Text = PageCount.ToString();
                      LRecordCount.Text = RecCount.ToString();
                      //判断跳页文本框失效
                      if(RecCount <= 20)
                       gotoPage.Enabled = false;
                      TDataBind();//调用数据绑定函数TDataBind()进行数据绑定运算
                     }
                    }
                          //计算余页
                    public int OverPage()
                    {
                     int pages = 0;
                     if(RecCount%PageSize != 0)
                      pages = 1;
                     else
                      pages = 0;
                     return pages;
                    }
                          //计算余页,防止SQL语句执行时溢出查询范围
                    public int ModPage()
                    {
                     int pages = 0;
                     if(RecCount%PageSize == 0 && RecCount != 0)
                      pages = 1;
                     else
                      pages = 0;
                     return pages;
                    }
                          /*
                     *计算总记录的静态函数
                     *本人在这里使用静态函数的理由是:如果引用的是静态数据或静态函数,连接器会优化生成代码,去掉动态重定位项(对

                  海量数据表分页效果更明显)。
                     *希望大家给予意见、如有不正确的地方望指正。
                    */
                    public static int Calc()
                    {
                     int RecordCount = 0;
                     SqlCommand MyCmd = new SqlCommand("select count(*) as co
                  from redheadedfile",MyCon());
                     SqlDataReader dr = MyCmd.ExecuteReader();
                     if(dr.Read())
                      RecordCount = Int32.Parse(dr["co"].ToString());
                     MyCmd.Connection.Close();
                     return RecordCount;
                    }
                          //数据库连接语句(从Web.Config中获取)
                    public static SqlConnection MyCon()
                    {
                     SqlConnection MyConnection = new
                  SqlConnection(ConfigurationSettings.AppSettings["DSN"]);
                     MyConnection.Open();
                     return MyConnection;
                    }
                          //对四个按钮(首页、上一页、下一页、尾页)返回的CommandName值进行操作
                    private void Page_OnClick(object sender, CommandEventArgs e)

                    {
                     CurrentPage =
                  (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行参数运


                  算
                              Pages =
                  (int)ViewState["PageCounts"];//从ViewState中读取总页参数运算
                  string cmd = e.CommandName;
                     switch(cmd)//筛选CommandName
                     {
                      case "next":
                       CurrentPage++;
                       break;
                      case "prev":
                       CurrentPage--;
                       break;
                      case "last":
                       CurrentPage = Pages;
                       break;
                      default:
                       CurrentPage = 0;
                       break;
                     }
                     ViewState["PageIndex"] =
                  CurrentPage;//将运算后的CurrentPage变量再次保存至ViewState
                     TDataBind();//调用数据绑定函数TDataBind()
                    }

                    private void TDataBind()
                    {
                     CurrentPage =
                  (int)ViewState["PageIndex"];//从ViewState中读取页码值保存到CurrentPage变量中进行按钮失


                  效运算
                     Pages =
                  (int)ViewState["PageCounts"];//从ViewState中读取总页参数进行按钮失效运算
                     //判断四个按钮(首页、上一页、下一页、尾页)状态
                     if (CurrentPage + 1 > 1)
                     {
                      Fistpage.Enabled = true;
                      Prevpage.Enabled = true;
                     }
                     else
                     {
                      Fistpage.Enabled = false;
                      Prevpage.Enabled = false;
                     }
                     if (CurrentPage == Pages)
                     {
                      Nextpage.Enabled = false;
                      Lastpage.Enabled = false;
                     }
                     else
                     {
                      Nextpage.Enabled = true;
                      Lastpage.Enabled = true;
                     }
                              //数据绑定到DataList控件
                     DataSet ds = new DataSet();
                     //核心SQL语句,进行查询运算(决定了分页的效率:))
                     SqlDataAdapter MyAdapter = new SqlDataAdapter("Select Top
                  "+PageSize+" * from redheadedfile where id 

                  not in(select top "+PageSize*CurrentPage+" id from
                  redheadedfile order by id asc) order by id asc",MyCon());
                     MyAdapter.Fill(ds,"news");
                     datalist1.DataSource = ds.Tables["news"].DefaultView;
                     datalist1.DataBind();
                     //显示Label控件LCurrentPaget和文本框控件gotoPage状态
                     LCurrentPage.Text = (CurrentPage+1).ToString();
                     gotoPage.Text = (CurrentPage+1).ToString();
                     //释放SqlDataAdapter
                     MyAdapter.Dispose();
                    }

                    #region Web 窗体设计器生成的代码
                    override protected void OnInit(EventArgs e)
                    {
                     //
                     // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
                     //
                     InitializeComponent();
                     base.OnInit(e);
                    }
                    
                    /// <summary>
                    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
                    /// 此方法的内容。
                    /// </summary>
                    private void InitializeComponent()
                    {    
                     this.Fistpage.Command += new
                  System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);

                     this.Prevpage.Command += new
                  System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);

                     this.Nextpage.Command += new
                  System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);

                     this.Lastpage.Command += new
                  System.Web.UI.WebControls.CommandEventHandler(this.Page_OnClick);

                     this.gotoPage.TextChanged += new
                  System.EventHandler(this.gotoPage_TextChanged);
                     this.Load += new System.EventHandler(this.Page_Load);

                    }
                    #endregion
                          //跳页代码
                    private void gotoPage_TextChanged(object sender,
                  System.EventArgs e)
                    {
                     try
                     {
                      JumpPage =
                  (int)ViewState["JumpPages"];//从ViewState中读取可用页数值保存到JumpPage变量中

                      //判断用户输入值是否超过可用页数范围值
                      if(Int32.Parse(gotoPage.Text) > JumpPage ||
                  Int32.Parse(gotoPage.Text) <= 0)

                  Response.Write("<script>alert(’页码范围越界!’);location.href=’WebForm8.aspx’</script>");

                      else
                      {
                       int InputPage = Int32.Parse(gotoPage.Text.ToString()) -
                  1;//转换用户输入值保存在int型

                  InputPage变量中
                       ViewState["PageIndex"] =
                  InputPage;//写入InputPage值到ViewState["PageIndex"]中
                       TDataBind();//调用数据绑定函数TDataBind()再次进行数据绑定运算
                      }
                     }
                        //捕获由用户输入不正确数据类型时造成的异常
                     catch(Exception exp)
                     {
                     
                  Response.Write("<script>alert(’"+exp.Message+"’);location.href=’WebForm8.aspx’</script>");

                     }
                    }
                   }
                  }

                  大家来试试,效率是不是高了很多?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值