设计数据分页

作者: 冷月(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); 



你可能感兴趣的:(分页)