利用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> ");
else
{
sbpager.append("<a href=?page="+i+">" + i + "</a> ");
}
}
sbpager.append(_recordcount + " records");
#endregion
}
在前台中
分页:<%=getpager()%>调用就ok了
这样,初级的分页就完成了
但这样写代码很烦琐,看以后能不能写成一个自定义控件.
经典论坛讨论帖:
http://www.blueidea.com/bbs/newsdetail.asp?id=2547620
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器