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