利用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了
这样,初级的分页就完成了
但这样写代码很烦琐,看以后能不能写成一个自定义控件.

利用SqlDataAdapter进行分页的更多相关文章

  1. 我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库

    我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库代码:SqlConnection ...

  2. ASP利用Recordset实现分页

    <!--#INCLUDE FILE="../function/db.asp" --> <!--#INCLUDE FILE="../function/co ...

  3. 利用mybatis的分页插件实现商品列表的显示

    分析思路: 当我们点击查询商品的时候,会出现商品的列表,并按上下页可以实现分页的查询的功能. 首先首先我们先找到商品查询商品的按钮在jsp的那个页面,即首页index.jsp 这里有个url即显示商品 ...

  4. Python-Flask:利用flask_sqlalchemy实现分页效果

    Flask-sqlalchemy是关于flask一个针对数据库管理的.文中我们采用一个关于员工显示例子. 首先,我们创建SQLALCHEMY对像db. from flask import Flask, ...

  5. EF 利用PagedList进行分页并结合查询 方法2

    微软提供了PagedList分页,相信大家在网上也能搜索一大堆关于pagedList用法的博客,论坛.但是,在使用的过程中一不小心,就会掉入pagedList某种常规用法的陷阱. 我所说的某种常规用法 ...

  6. row_number() over order by与利用rownum查询分页效率分析

    实际测试: 数据库:70万条数据 查询第10000页,每页10条.row_number() 耗时: 2.2秒rownum 耗时:1.3秒 查询第20000页,每页10条.row_number() 耗时 ...

  7. Django 利用 Pagination 简单分页

    Django自身提供了一些类来实现管理分页,数据被分在不同的页面中,并带有“上一页/下一页”标签.这个类叫做Pagination,其定义位于 django/core/paginator.py 中. 一 ...

  8. 高效的MySQL分页——利用子查询分页

    ——先抄回来~~~ 首先看一下分页的基本原理: mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G*** ...

  9. 利用ajax实现分页效果

    在网页中看到的分页效果,想一下就点击分页中的内容的时候,然后调用ajax调出对应的数据,正确的显示在相应的标签内. 1.用html实现正确的样式和结构 2.采用jquery中的ajax调出数据. 需要 ...

随机推荐

  1. Windows上编译LLVM 3.2

    LLVM还是做的很好的,可以很方便的编译. 解压LLVM 3.2到[工作目录]/llvm/llvm-3.2.src 解压Clang到[工作目录]/llvm/llvm-3.2.src/tools/cla ...

  2. MongoDB高级知识

    MongoDB高级知识 一.mongodb适合场景: 1.读写分离:MongoDB服务采用三节点副本集的高可用架构,三个数据节点位于不同的物理服务器上,自动同步数据.Primary和Secondary ...

  3. 爬虫开发10.scrapy框架之日志等级和请求传参

    今日概要 日志等级 请求传参 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是scrapy的日志信息. - 日志 ...

  4. 9w5:第九周程序填空题1

    描述 下面的程序输出结果是: 1 2 6 7 8 9 请填空: #include <iostream> #include <iterator> #include <set ...

  5. 使用 Git 进行版本控制

    使用 Git 进行版本控制 版本控制软件让你能够拍摄处于可行状态的项目的快照.修改项目(如实现新功能)后,如果项目不能正常运行,可恢复到前一个可行状态. 通过使用版本控制软件,你可以无忧无虑地改进项目 ...

  6. CentOS7-Minimal1708安装设置python3

    使用 python -V 命令查看一下是否安装Python然后使用命令 which python 查看一下Python可执行文件的位置可见执行文件在/usr/bin/ 目录下,切换到该目录下执行 ll ...

  7. P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分

    $ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...

  8. leetcode-824-Goat Latin(字符串的处理)

    题目描述: A sentence S is given, composed of words separated by spaces. Each word consists of lowercase ...

  9. AWS S3

    Amazon Simple Storage Service (Amazon S3) Amazon S3 提供了一个简单 Web 服务接口,可用于随时在 Web 上的任何位置存储和检索任何数量的数据.此 ...

  10. js 删除数组的某一项或者几项的方法

    1.arr.splice() splice(index,len,[item])    注释:该方法会改变原始数组. splice有3个参数,它也可以用来替换/删除/添加数组内某一个或者几个值 inde ...