由于“bigfocus”同志一直对海量分页情有独钟,特别是长达半个多月都未对他的小小要求作出回应,自感觉十分愧疚,于是打算对曾经辉煌过的海量分页作出补充说明。
首先海量分页方法是本人在学习ASP.NET后,以ASP版的海量分页为基础,重新设计的东东,为的是在大记录量的情况下,尽量降低SQL的负荷。那时候还不懂什么叫MVC,也不懂缓存Dataset什么的,就知道Datareader()这种东西,拿着rs.Read()写C#版的ASP,显得特天真单纯。现在看来,海量分页在当时的情况下,确实为个人发展作出了应有的贡献,但随着对ASP.NET的理解的深入,海量分页也完成了它的使命,渐渐退出了历史舞台。
言归正传,海量分页的核心思想是“组合SQL语句,仅读取需要的记录”。我是用类似“select top N”这样的语句来取得数据的。这样带来的问题是,我得在逻辑层甚至表现层上写不少where和and这样的东西,代码杂乱缺乏美感,更糟糕的是,它难以写数据绑定(不是不能,只是很麻烦)。
下面的代码是一张翻页列表页的实现:
string sqlField = " ID,IndexID,Title,CreateDate";//字段
string sqlFrom = " from UserV_Article";
string sqlOrder = " order by isTop desc,ID desc";//排序
string pageStr = Request["page"];//当前页数
int pageSize = 15;//每页记录数
string sqlWhere = " ";//当有条件时为where
string sqlAnd = " ";//当有条件时为and
string sqlCondition = " ";//条件
sqlWhere = " where";
sqlAnd = " and";
sqlCondition = " IndexID=" + Request["IndexID"] + " and isAuditing=1 and isDel=0 and CreateDate<'" + DateTime.Now.ToString() + "'";//
stackPage SP = new stackPage();
int recordCount = SP.sRecordCount(sqlFrom, sqlWhere, sqlCondition);//得到总记录条数
int pageCount = SP.sPageNum(pageSize, recordCount);//得到总页数
int page = SP.sPageNow(pageStr, pageCount);//得到当前页号码
int countNum = SP.sCountNum(pageSize, recordCount, page, pageCount);//得到当前页显示条数
if (countNum==0)
{
liMessage.Visible = true;
}
else
{
SqlDataReader rsArticle = SP.sShowPage(sqlField, sqlFrom, sqlWhere, sqlAnd, sqlCondition, sqlOrder, page, recordCount, pageSize);//获得分页数据集
rptList.DataSource = rsArticle;
rptList.DataBind();
ViewState["pageCount"] = pageCount.ToString();
}
主要功能是获得指定字段的记录集合,在前台生成页数。当时还不清楚如何写控件的属性,无奈的用ViewState传递页数的值,哈哈真是把人笑死了。
下面是海量分页示例代码的内容,示例代码压缩包下载地址是:点我下载。
使用方法:
1、下载了解压缩
2、www目录建立虚拟目录
3、data目录是MSSQL数据库文件,推荐使用SQL2000进行附加操作
4、配置一下web.config里的连接字符串
5、浏览的试试,如果有问题可以在这帖子下面留言提问
PS:看了示例代码希望大家不要笑我,这代码这年头看起来确实满恶心的,不过这都是我当年岁月的记载啊,特别是有朋友特别想看,我就发出来给大家瞄瞄~~~~~
处女座的人有着超级完美主义,特别是我这种代码洁癖型,对过去的代码都是超级否定的,极容易引起重构的冲动,于是在上面数落了半天海量翻页的各种弊端(虽然确实存在)。
如果大家有更好的办法进行分页什么的,欢迎一起讨论一下,嘿嘿嘿。
欢迎转载,转载请注明出处:http://www.cnblogs.com/Tonyyang/