在存储过程中实现分页

 CREATE PROCEDURE dbo.CreateSimple
 (
  @PageIndex int,
  @PageSize int
 )
 AS
 BEGIN
  --定义三个变量:
  -- @PageLowerBound :所取出记录的下限.
 -- @PageUpperBound: 所要取出记录的上限.
 -- @TotalRecords: 返回记录总数,主要用于页面的计算.
 DECLARE @PageLowerBound int
 DECLARE @PageUpperBound int
 DECLARE @TotalRecords int

 --计算上下限的值.
 SET @PageLowerBound=@PageIndex * @PageSize
 SET @PageUpperBound=@PageLowerBound+@PageSize-1

--创建临时表:
--IndexId是标识,自动增长1;
--SimpleId由数据表[Simple]填充;
 CREATE TABLE #PageIndexForSimple
 (
  IndexId int identity(0,1) NOT NULL,
  SimpleId int
 )
--填充临时表
  INSERT INTO #PageIndexForSimple(SimpleId)
  SELECT s.[SimpleId]
  FROM [Simple] s
  --这里可以加WHERE condition和ODER BY语句
  
  --取得记录总数,其实影响行数就是记录总数
  SELECT @TotalRecords=@@ROWCOUNT

  --获取我们所要的记录.
  SELECT s.*
  FROM [Simple] s,#PageIndexForSimple p
  WHERE s.[SimpleId]=p.[SimpleId]
            AND p.[IndexId]>=@PageLowerBound
            AND P.[IndexId]<=@PageUpperBound
  ORDER BY s.[Simple]
 
   --返回记录总数.
   RETURE @TotalRecords
END      由上面的注释就能看懂了,呵呵,既然写到这里也把程序的代码写出来:
Public List<Simple> GetSimple(int pageIndex,int pageIndex,out int totalRecords){
  List<Simple> entity=new List<Simple>();
  SqlParameter[]param=new SqlParameter[]{
     new SqlParameter("@PageIndex",SqlDbType.Int),
     new SqlParameter("@PageSize",SqlDbType.Int),
   new SqlParameter("@ReturnValue",SqlDbType.Int),
 };
  param[0].Value=pageIndex;
  param[1].Value=pageSize;
  param[2].Direction = ParameterDirection.ReturnValue;
  SqlDataReader reader=SqlHelper.ExecuteReader(CommandType.StoredProcedure, "GetSimple", param);
  While(reader.Read()){
   entity.Add(GetSimpleEntity(reader))
  }
  reader.Close();
  try{
       totalRecords=(int)param[2].Value;
  }catch{}
  return entity;
}    上面的一些函数是自己写的:
     SqlHelper类:简化数据库查询类.
    GetSimpleEntity(SqlDataReader reader):由于经常在项目中会用到好基础实体类的获取,所以单独写一个私有函数,以便重用;
    值得注意的是获取总的记录数时可能类型为DbNull而导致错误.
posted @ 2008-03-10 17:16  supers  阅读(132)  评论(0)    收藏  举报