--最通用的分页存储过程 -- 获取指定页的数据 CREATEPROCEDURE Pagination @tblNamevarchar(255), -- 表名 @strGetFieldsvarchar(1000) ='*', -- 需要返回的列 @fldNamevarchar(255)='', -- 排序的字段名 @PageSizeint=10, -- 页尺寸 @PageIndexint=1, -- 页码 @doCountbit=0, -- 返回记录总数, 非 0 值则返回 @OrderTypebit=0, -- 设置排序类型, 非 0 值则降序 @strWherevarchar(1500) =''-- 查询条件 (注意: 不要加 where) AS declare@strSQLvarchar(5000) -- 主语句 declare@strTmpvarchar(110) -- 临时变量 declare@strOrdervarchar(400) -- 排序类型 if@doCount!=0 begin if@strWhere!='' set@strSQL='select count(*) as Total from ['+@tblName+'] where '+@strWhere else set@strSQL='select count(*) as Total from ['+@tblName+']' end --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都 --是@doCount为0的情况 else begin if@OrderType!=0 begin set@strTmp='<(select min' set@strOrder=' order by ['+@fldName+'] desc' --如果@OrderType不是0,就执行降序,这句很重要! end else begin set@strTmp='>(select max' set@strOrder=' order by ['+@fldName+'] asc' end if@PageIndex=1 begin if@strWhere!='' set@strSQL='select top '+str(@PageSize) +''+@strGetFields+' from ['+@tblName+'] where '+@strWhere+''+@strOrder else set@strSQL='select top '+str(@PageSize) +''+@strGetFields+' from ['+@tblName+'] '+@strOrder --如果是第一页就执行以上代码,这样会加快执行速度 end else begin --以下代码赋予了@strSQL以真正执行的SQL代码 set@strSQL='select top '+str(@PageSize) +''+@strGetFields+' from ['+@tblName+'] where ['+@fldName+']'+@strTmp+'(['+@fldName+']) from (select top '+str((@PageIndex-1)*@PageSize) +' ['+@fldName+'] from ['+@tblName+']'+@strOrder+') as tblTmp)'+@strOrder if@strWhere!='' set@strSQL='select top '+str(@PageSize) +''+@strGetFields+' from ['+@tblName+'] where ['+@fldName+']'+@strTmp+'(['+@fldName+']) from (select top '+str((@PageIndex-1)*@PageSize) +' ['+@fldName+'] from ['+@tblName+'] where '+@strWhere+''+@strOrder+') as tblTmp) and '+@strWhere+''+@strOrder end end exec ( @strSQL) GO
下面是C#的代码
using System.Data ; using System.Data.SqlClient ; using Microsoft.ApplicationBlocks.Data ; using System.Web ; using System.Web.UI ; namespace RssLayer.PageHelper { /**////<summary> /// 分页类PagerHelper 的摘要说明。 ///</summary> publicclass PagerHelper { privatestring connectionString; public PagerHelper(string tblname,string sortname,bool docount,string connectionString) { this.tblName = tblname; this.fldName = sortname ; this.connectionString = connectionString ; this.docount = docount; } public PagerHelper(string tblname,bool docount, string strGetFields, string fldName,int pagesize, int pageindex,bool ordertype,string strwhere,string connectionString ) { this.tblName = tblname ; this.docount = docount ; this.strGetFields = strGetFields ; this.fldName = fldName; this.pagesize = pagesize ; this.pageindex = pageindex; this.ordertype = ordertype ; this.strwhere = strwhere ; this.connectionString = connectionString ; } /**////<summary> /// 得到记录集的构造函数 ///</summary> ///<param name="tblname"></param> ///<param name="strwhere"></param> ///<param name="connectionString"></param> public PagerHelper(string tblname,string strwhere,string connectionString) { this.tblName = tblname; this.strwhere = strwhere ; this.docount =true; this.connectionString = connectionString ; } privatestring tblName; publicstring TblName { get{return tblName;} set{tblName =value;} } privatestring strGetFields="*"; publicstring StrGetFields { get{return strGetFields ;} set{strGetFields =value;} } privatestring fldName=string.Empty; publicstring FldName { get{return fldName ;} set{fldName =value;} } privateint pagesize =10; publicint PageSize { get{return pagesize ;} set{pagesize =value;} } privateint pageindex =1; publicint PageIndex { get{return pageindex ;} set{pageindex =value;} } privatebool docount=false; publicbool DoCount { get{return docount ;} set{docount =value;} } privatebool ordertype=false; publicbool OrderType { get{return ordertype ;} set{ordertype =value;} } privatestring strwhere=string.Empty ; publicstring StrWhere { get{return strwhere ;} set{strwhere =value;} } public IDataReader GetDataReader() { if(this.docount) { thrownew ArgumentException("要返回记录集,DoCount属性一定为false"); } // System.Web.HttpContext.Current.Response.Write(pageindex); return SqlHelper.ExecuteReader(connectionString,CommandType.StoredProcedure,"Pagination", new SqlParameter("@tblName",this.tblName), new SqlParameter("@strGetFields",this.strGetFields), new SqlParameter("@fldName",this.fldName), new SqlParameter("@PageSize",this.pagesize), new SqlParameter("@PageIndex",this.pageindex), new SqlParameter("@doCount",this.docount), new SqlParameter("@OrderType",this.ordertype), new SqlParameter("@strWhere",this.strwhere) ); } public DataSet GetDataSet() { if(this.docount) { thrownew ArgumentException("要返回记录集,DoCount属性一定为false"); } return SqlHelper.ExecuteDataset(connectionString,CommandType.StoredProcedure,"Pagination", new SqlParameter("@tblName",this.tblName), new SqlParameter("@strGetFields",this.strGetFields), new SqlParameter("@fldName",this.fldName), new SqlParameter("@PageSize",this.pagesize), new SqlParameter("@PageIndex",this.pageindex), new SqlParameter("@doCount",this.docount), new SqlParameter("@OrderType",this.ordertype), new SqlParameter("@strWhere",this.strwhere) ); } publicint GetCount() { if(!this.docount) { thrownew ArgumentException("要返回总数统计,DoCount属性一定为true"); } return (int)SqlHelper.ExecuteScalar(connectionString,CommandType.StoredProcedure,"Pagination", new SqlParameter("@tblName",this.tblName), new SqlParameter("@strGetFields",this.strGetFields), new SqlParameter("@fldName",this.fldName), new SqlParameter("@PageSize",this.pagesize), new SqlParameter("@PageIndex",this.pageindex), new SqlParameter("@doCount",this.docount), new SqlParameter("@OrderType",this.ordertype), new SqlParameter("@strWhere",this.strwhere) ); } } }