在存储过程中实现分页.

 我不是一个很有经验的程序员,在做项目的过程中会遇到很多的问题,在数据库中使用分页就是我做项目中遇到的一个问题.我从网上查了很多资料,有很多种方法.但我觉的创建临时数据表是最简单的方法,在我做Membership扩展时发现原来微软也是这样用的,你可一随便打开一个Membership的存储过程看看.
     说了再多也没用,只要看看代码就清楚了,呵呵.
    
 1 None.gif CREATE   PROCEDURE  dbo.CreateSimple
 2 None.gif(
 3 None.gif  @PageIndex   int ,
 4 None.gif  @PageSize   int
 5 None.gif)
 6 None.gif AS
 7 None.gif BEGIN
 8 None.gif  -- 定义三个变量:
 9 None.gif   --  @PageLowerBound :所取出记录的下限.
10 None.gif   --  @PageUpperBound: 所要取出记录的上限.
11 None.gif   --  @TotalRecords: 返回记录总数,主要用于页面的计算.
12 None.gif   DECLARE   @PageLowerBound   int
13 None.gif  DECLARE   @PageUpperBound   int
14 None.gif  DECLARE   @TotalRecords   int
15 None.gif
16 None.gif  -- 计算上下限的值.
17 None.gif   SET   @PageLowerBound = @PageIndex   *   @PageSize
18 None.gif  SET   @PageUpperBound = @PageLowerBound + @PageSize - 1
19 None.gif
20 None.gif -- 创建临时表:
21 None.gif-- IndexId是标识,自动增长1;
22 None.gif-- SimpleId由数据表[Simple]填充;
23 None.gif   CREATE   TABLE  #PageIndexForSimple
24 None.gif (
25 None.gif  IndexId  int   identity ( 0 , 1 NOT   NULL ,
26 None.gif  SimpleId  int
27 None.gif )
28 None.gif -- 填充临时表
29 None.gif    INSERT   INTO  #PageIndexForSimple(SimpleId)
30 None.gif   SELECT  s. [ SimpleId ]
31 None.gif   FROM   [ Simple ]  s
32 None.gif   -- 这里可以加WHERE condition和ODER BY语句
33 None.gif   
34 None.gif   -- 取得记录总数,其实影响行数就是记录总数
35 None.gif    SELECT   @TotalRecords = @@ROWCOUNT
36 None.gif
37 None.gif   -- 获取我们所要的记录.
38 None.gif    SELECT  s. *
39 None.gif   FROM   [ Simple ]  s,#PageIndexForSimple p
40 None.gif   WHERE  s. [ SimpleId ] = p. [ SimpleId ]
41 None.gif             AND  p. [ IndexId ] >= @PageLowerBound
42 None.gif             AND  P. [ IndexId ] <= @PageUpperBound
43 None.gif   ORDER   BY  s. [ Simple ]
44 None.gif 
45 None.gif    -- 返回记录总数.
46 None.gif    RETURE  @TotalRecords
47 None.gif END  
     由上面的注释就能看懂了,呵呵,既然写到这里也把程序的代码写出来:
 1 ExpandedBlockStart.gif ContractedBlock.gif Public List < Simple >  GetSimple( int  pageIndex, int  pageIndex,out int totalRecords) dot.gif {
 2InBlock.gif  List<Simple> entity=new List<Simple>();
 3ExpandedSubBlockStart.gifContractedSubBlock.gif  SqlParameter[]param=new SqlParameter[]dot.gif{
 4InBlock.gif     new SqlParameter("@PageIndex",SqlDbType.Int),
 5InBlock.gif     new SqlParameter("@PageSize",SqlDbType.Int),
 6InBlock.gif   new SqlParameter("@ReturnValue",SqlDbType.Int),
 7ExpandedSubBlockEnd.gif }
;
 8InBlock.gif  param[0].Value=pageIndex;
 9InBlock.gif  param[1].Value=pageSize;
10InBlock.gif  param[2].Direction = ParameterDirection.ReturnValue;
11InBlock.gif  SqlDataReader reader=SqlHelper.ExecuteReader(CommandType.StoredProcedure, "GetSimple", param);
12ExpandedSubBlockStart.gifContractedSubBlock.gif  While(reader.Read())dot.gif{
13InBlock.gif   entity.Add(GetSimpleEntity(reader))
14ExpandedSubBlockEnd.gif  }

15InBlock.gif  reader.Close();
16ExpandedSubBlockStart.gifContractedSubBlock.gif  trydot.gif{
17InBlock.gif       totalRecords=(int)param[2].Value;
18ExpandedSubBlockStart.gifContractedSubBlock.gif  }
catchdot.gif{}
19InBlock.gif  return entity;
20ExpandedBlockEnd.gif}
    上面的一些函数是自己写的:
     SqlHelper类:简化数据库查询类.
    GetSimpleEntity(SqlDataReader reader):由于经常在项目中会用到好基础实体类的获取,所以单独写一个私有函数,以便重用;
    值得注意的是获取总的记录数时可能类型为DbNull而导致错误.


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

转载于:https://www.cnblogs.com/xiongeee/archive/2006/12/23/601146.html

你可能感兴趣的:(在存储过程中实现分页.)