Asp.Net 数据分页

.Net 所使用的ADO.Net较前身ADO在性能上有较大的提升,但是操作起来也较为繁琐,在 Asp时代,对数据进行分页使用 RecordSet 的 PageSize 和 AbsolutePage即可完成对数据的分页操作,非常简单,进入 .Net 后,RecordSet 对象没有了,取而代之的是 DataSet/DataTable,没有了 PageSize/AbsolutePage,分页成了一件非常头痛的事。

所有的 Asp.Net 初级教程中都会讲解如何使用 DataGrid 控件进行基于 Post 的分页,当我练习完这个例子后从来没有在实战中使用过,原因有二:

  1. 代码过于复杂;
  2. 不支持url分页,不利于搜索引擎和调试,定制度不高。

所以建议大家也都不要用这个分页了,呵呵,真垃圾。

Asp.Net 能不能像 Asp 一样简单地分页呢?答案是可以的,要使用 PageDataSource 类,这里有篇很完整的教程给大家参考,一位高手的Blog。

使用 PageDataSource 很方便,但它也有个致命的缺点,就是性能上的下降,偶对一张10000条数据的表格进行了 Asp/Asp.Net(DataGrid)/Asp.Net(PageDataSource) 三项分页速度测试,结果分别是 600ms-700ms / 500ms / 900ms-1000ms ,使用了 PageDataSource 分页速度竟然比 Asp 都慢,郁闷,原因大概是因为作了二次数据绑定造成的吧,大家可以自行测试,看是否和我测试的结果相同。

精华部分到啦……

要提高分页的性能,还得使用自定义分页,首先我们来看看传统的 Asp 分页时需要哪些参数?

  1. PageSize(每页显示记录条数)
  2. RecordCount(总记录数)
  3. PageCount(总页数)
  4. AbsolutePage(绝对页)。

回到 Asp.Net,我们来做一个例子,我们对 /NewsList.asp?Page=3 进行分页,可以这样做:

1int PageSize=20; //定义每页显示的记录条数
2int RecordCount=”select count(*) from news”; //这句不完整,大家自行完善
3int PageCount=RecordCount/PageSize; //总页数算出来啦
4int CurrentPage=Convert.ToInt32(Request.QueryString[“Page”].ToString());

关键时候到了,需要向 DataSet 中填充数据,注意这个技巧:

1dAdapter.Fill(dSet, (CurrentPage - 1) * PageSize, PageSize, "Table");

这一句可以向DataSet中填充指定位置的数据,这样就可以达到分页的效果啦。

经测试,这样的分页因向DataSet中填充数据量的减少,降低了服务器内存消耗,页面执行速度大约在 120ms-170ms,爽啊!:em31: