冷月TinyHU的Blog

 http://tinyhu.cnblogs.com

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

作者: 冷月(TinyHU)

 

SQL2005由于加入了ROW_NUMBER()函数,要做数据分页就很简单了。如一个产品表的分页:

SELECT TOP(10) * FROM (SELECT prodcode,name, ROW_NUMBER()   
OVER (ORDER BY prodcode) AS ROW_Number FROM t_product) as T  
WHERE Row_Number > ((5 - 1) * 10)

 

 

上述SQL语句是查询第5页的数据,每页10条记录。 但在实际使用过程中,由于常规的数据检索语句要人为加上ROW_NUMBER()函数并且还要考虑是取第几页,页的大小问题,还是过于有些复杂。为了隐藏复杂性,我们应做一个类库,封装起来,隐藏复杂的实现细节。

namespace TinyHu.Common
{
 public class DataPage
 {
 public DataSet GetData(string selectSqlCmd, string orderbyFieldName, int pageNo, int pageSize)
 {
 string sqlCmd;
 //将常规的SELECT检索语句转换成能分页的SELECT语句
 sqlCmd = "SELECT top(" + pageSize.ToString() + ") * FROM ( " +
 "SELECT ROW_NUMBER() OVER (ORDER BY " + orderbyFieldName + ") AS ROW_Number," + selectSqlCmd.Substring(7, selectSqlCmd.Length-7)+
 ") as t WHERE Row_Number>((" + pageNo.ToString() + "-1)*" + pageSize.ToString() + ")"; 
SQlHelper dbs;
 return dbs.GetDataSet(sqlCmd);
 }
 }
}

 
现在我们要分页检索的数据,只需简单的调用此方法传入正常的SELECT SQL语句,不必单独再写复杂的分页存储过程或分页的SQL专用语句。如检索产品表的第3页数据,每页10条记录。
ds = dataPage.GetData("select prodcode,name from t_product", "prodcode", 3, 10); 

如检索销售记录数据,第5页数据,每页100条记录。

ds = dataPage.GetData("select ProdID,Quantity,... from SalesOrderDetl", "ProdID",5, 100);

 

但我们还得继续改进这个类,比如当需要在GRID中显示的时候需要告诉用户共有多少条记录或页。 为此我们还得加一个方法取得总记录数或页数。 

public int GetRecordTotal(string selectSqlCmd)
{
 SQLHelper dbs;
 return dbs.ExecuteNonQuery(selectSqlCmd)
 }

这样当我们在绑定GRIDVIEW前可以将记录数先检索出来:

int totalRecord= DataPage.GetRecordTotal("select 1 from t_product")
int totalPage = (int) Math.Ceiling( (double)totalRecord / (double) pageSize); 

posted on 2008-10-08 11:31  冷月TinyHU  阅读(1013)  评论(0编辑  收藏  举报