• 利用SqlDataAdapter进行分页


    利用SqlDataAdapter进行记录分页

    说到分页,很多地方都会用到,不管是windows程序还是web程序,为什么要进行分页?很简单,如果BlueIdea BBS帖子列表不分页的话,几十万条记录,可想而知.......

    分页有几种方法,可以用存储过程进行分页,将要显示的记录写入一个临时表中,再从临时表中取出这些记录,取出的记录呢,也就是当前页的记录了。
    我这里谈到的,是利用SqlDataAdapter Fill方法的重载,进行分页

    public int Fill (
        DataSet dataSet,
        int startRecord,
        int maxRecords,
        string srcTable
    )

    参数:

    dataSet
    要用记录和架构(如果必要)填充的 DataSet。

    startRecord
    从其开始的从零开始的记录号。

    maxRecords
    要检索的最大记录数。

    srcTable
    用于表映射的源表的名称。

    返回值
    已在 DataSet 中成功添加或刷新的行数。这不包括受不返回行的语句影响的行。

    示例方法:

    DataTable tbl = SqlDataAdapter.Fill(objDst,1,10,"temp")

    言归正传,在这个设计过程中,我们需要哪些参数呢?

    1、_pagesize----int型,每页要显示的记录数

    2、_pagecount----总记录数,这是需要算出来的

    _pagesize可以在web.config中设定,至于_pagecount嘛,得首先知道总的记录数,所以,我们得先弄出记录数出来,大家可以用一条sql语句查询而得到,这里就不多说了。假定已得知记录数,现在计算总页数

    _pagecount = (_recordCount % _pagesize==0) ? (_recordCount / _pagesize) : (_recordCount / _pagesize + 1);

    这里用总记录数去除以每页显示的记录数,如果能整除,说明直接用记录数除以页记录数就能得到总页数,否则,就用记录数除页记录数再加上1就可得到总页数了
    是不是具备这些就够了呢?
    当然不够
    想想,Fill方法时的第二个参数startRecord怎么赋值呢?如果是第1页的话很简单,直接传1,因为我们从第1条开始取嘛,如果是第二页呢?怎么办?
    假定,我们每页显示10条,当前是第2页,那么应该从多少条开始取??大家应该想到了,应该从11条开始,也就是取11-20条,那这里的11怎么得到?
    算法:
    (_page-1) * _pagesize + 1
    (2-1) * 10 + 1 = 11
    其中_page是当前页,但这个数必须大于1
    OK,有了这些基础,再来分页就简单了

    .....
    int _page;
    int _pagesize = 10;
    int _pagecount;
    int _recordcount;
    System.Text.StringBuilder sbPager = new System.Text.StringBuilder();  //用来显示分页
    //在.aspx页中调用,用以显示分页代码
    public string getPager()
    {
      return sbPager.ToString();
    }
    //计算出记录数
    _recordcount = 134;
    //判断当前页数
    private void Page_Load(object sender, System.EventArgs e)
      {
       if(Request.QueryString["page"]==null)
       {
        _page = 1;
       }
       else
       {
        _page = Int16.Parse(Request.QueryString["page"]);
                }
     ...............
      }
    //开始填充数据
    private void FillList()
      {
       _recordcount= BLL.MessageBLL.getListCount("");    //取得总记录数
       _pagecount = (_recordcount % _pagesize==0)?(_recordcount/_pagesize):(_recordcount/_pagesize+1);    //得到总页数
       int _minPage=1;  
       if(_page!=1)
       {
        _minPage = (_page-1)*_pagesize + 1;
       }
       this.repMsgList.DataSource = BLL.MessageBLL.GetList("",_minPage,_pagesize);
       this.repMsgList.DataBind();
       #region 打印页数
       
        for (int i = 1; i <= _pagecount; i++)
        {
         if (i == _page)
          //如果是当前页,不显示链接
          sbPager.Append("<span >" + i.ToString() + "</span>&nbsp;");
         else
         {
           sbPager.Append("<a href=?page="+i+">" + i + "</a>&nbsp;");
         }
         
        }
       sbPager.Append(_recordcount + " Records");
       #endregion
      }

    在前台中
    分页:<%=getPager()%>调用就OK了
    这样,初级的分页就完成了
    但这样写代码很烦琐,看以后能不能写成一个自定义控件.

  • 相关阅读:
    MSchart设置网格线
    搭建ELDK交叉编译环境
    Virtualbox设置共享文件夹的方法
    VS2010自动关闭问题的解决方法
    如何让PHPCms内容页支持JavaScript
    Phpcms V9 调用全站最新文章的代码
    Phpcms V9 调用随机文章的方法
    VMware下Ubuntu不能和主机共享文件夹的解决方法
    Xshell无法连接Ubuntu的解决办法
    Phpcms V9 调用全站文章排行的解决方案
  • 原文地址:https://www.cnblogs.com/178mz/p/4169892.html
Copyright © 2020-2023  润新知