在存储过程中实现分页.



     我不是一个很有经验的程序员,在做项目的过程中会遇到很多的问题,在数据库中使用分页就是我做项目中遇到的一个问题.我从网上查了很多资料,有很多种方法.但我觉的创建临时数据表是最简单的方法,在我做Membership扩展时发现原来微软也是这样用的,你可一随便打开一个Membership的存储过程看看.
     说了再多也没用,只要看看代码就清楚了,呵呵.
     

   CREATE   PROCEDURE  dbo.CreateSimple
 2  (
 3    @PageIndex   int ,
 4    @PageSize   int 
 5  )
 6   AS 
 7   BEGIN 
 8    -- 定义三个变量: 
 9     --  @PageLowerBound :所取出记录的下限. 
10     --  @PageUpperBound: 所要取出记录的上限. 
11     --  @TotalRecords: 返回记录总数,主要用于页面的计算. 
12     DECLARE   @PageLowerBound   int 
13    DECLARE   @PageUpperBound   int 
14    DECLARE   @TotalRecords   int 
15  
16    -- 计算上下限的值. 
17     SET   @PageLowerBound = @PageIndex   *   @PageSize 
18    SET   @PageUpperBound = @PageLowerBound + @PageSize - 1 
19  
20   -- 创建临时表: 
21  -- IndexId是标识,自动增长1; 
22  -- SimpleId由数据表[Simple]填充; 
23     CREATE   TABLE  #PageIndexForSimple
24   (
25    IndexId  int   identity ( 1 , 1 )  NOT   NULL ,
26    SimpleId  int 
27   )
28   -- 填充临时表 
29      INSERT   INTO  #PageIndexForSimple(SimpleId)
30     SELECT  s. [ SimpleId ] 
31     FROM   [ Simple ]  s
32     -- 这里可以加WHERE condition和ODER BY语句 
33     
34     -- 取得记录总数,其实影响行数就是记录总数 
35      SELECT   @TotalRecords = @@ROWCOUNT 
36  
37     -- 获取我们所要的记录. 
38      SELECT  s. * 
39     FROM   [ Simple ]  s,#PageIndexForSimple p
40     WHERE  s. [ SimpleId ] = p. [ SimpleId ] 
41               AND  p. [ IndexId ] >= @PageLowerBound 
42               AND  P. [ IndexId ] <= @PageUpperBound 
43     ORDER   BY  s. [ Simple ] 
44   
45      -- 返回记录总数. 
46      RETURE  @TotalRecords 
47   END  
      由上面的注释就能看懂了,呵呵,既然写到这里也把程序的代码写出来:
 1   Public List < Simple >  GetSimple( int  pageIndex, int  pageIndex,out int totalRecords) {
 2  List<Simple> entity=new List<Simple>();
 3  SqlParameter[]param=new SqlParameter[]{
 4     new SqlParameter("@PageIndex",SqlDbType.Int),
 5     new SqlParameter("@PageSize",SqlDbType.Int),
 6   new SqlParameter("@ReturnValue",SqlDbType.Int),
 7 };
 8  param[0].Value=pageIndex;
 9  param[1].Value=pageSize;
10  param[2].Direction = ParameterDirection.ReturnValue;
11  SqlDataReader reader=SqlHelper.ExecuteReader(CommandType.StoredProcedure, "GetSimple", param);
12  While(reader.Read()){
13   entity.Add(GetSimpleEntity(reader))
14  }
15  reader.Close();
16  try{
17       totalRecords=(int)param[2].Value;
18  }catch{}
19  return entity;
20}

  上面的一些函数是自己写的:

     SqlHelper类:简化数据库查询类.

    GetSimpleEntity(SqlDataReader reader):由于经常在项目中会用到好基础实体类的获取,所以单独写一个私有函数,以便重用;

    值得注意的是获取总的记录数时可能类型为DbNull而导致错误. 


     第一次写,希望批评指正.

在存储过程中实现分页._实体类

作者:网魂小兵