在存储过程中实现分页.

简介:
     我不是一个很有经验的程序员,在做项目的过程中会遇到很多的问题,在数据库中使用分页就是我做项目中遇到的一个问题.我从网上查了很多资料,有很多种方法.但我觉的创建临时数据表是最简单的方法,在我做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 ( 1 , 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 Public List < Simple >  GetSimple( int  pageIndex, int  pageIndex,out int totalRecords) {
 2InBlock.gif  List<Simple> entity=new List<Simple>();
 3ExpandedSubBlockStart.gif  SqlParameter[]param=new SqlParameter[]{
 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.gif  While(reader.Read()){
13InBlock.gif   entity.Add(GetSimpleEntity(reader))
14ExpandedSubBlockEnd.gif  }

15InBlock.gif  reader.Close();
16ExpandedSubBlockStart.gif  try{
17InBlock.gif       totalRecords=(int)param[2].Value;
18ExpandedSubBlockStart.gif  }
catch{}
19InBlock.gif  return entity;
20ExpandedBlockEnd.gif}
    上面的一些函数是自己写的:
     SqlHelper类:简化数据库查询类.
    GetSimpleEntity(SqlDataReader reader):由于经常在项目中会用到好基础实体类的获取,所以单独写一个私有函数,以便重用;

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


本文转自网魂小兵博客园博客,原文链接:http://www.cnblogs.com/xdotnet/archive/2006/09/19/procedure_for_paging_select.html,如需转载请自行联系原作者

相关文章
|
6月前
|
存储
SQLServer分页获取数据的存储过程
SQLServer分页获取数据的存储过程
24 0
|
6月前
|
存储 开发框架 前端开发
基于MySQL 实现通用分页存储过程(下篇-超详细)(上)
基于MySQL 实现通用分页存储过程(下篇-超详细)
66 0
|
6月前
|
存储 XML 安全
基于MySQL 实现通用分页存储过程(下篇-超详细)(下)
基于MySQL 实现通用分页存储过程(下篇-超详细)
38 0
|
9月前
|
存储
【干货】SqlServer 总结几种存储过程分页的使用
【干货】SqlServer 总结几种存储过程分页的使用
|
11月前
|
存储 SQL Perl
PL/SQL编程—分页功能(存储过程)
PL/SQL编程—分页功能(存储过程)
87 0
|
存储
通用分页存储过程,干货无污染
通用分页存储过程,干货无污染