在存储过程中实现分页

2016-02-19 17:59 7 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐在存储过程中实现分页,无聊中的都看过来。

【 tulaoshi.com - Web开发 】

     我不是一个很有经验的程序员,在做项目的过程中会遇到很多的问题,在数据库中使用分页就是我做项目中遇到的一个问题.我从网上查了很多资料,有很多种方法.但我觉的创建临时数据表是最简单的方法,在我做Membership扩展时发现原来微软也是这样用的,你可一随便打开一个Membership的存储过程看看.
       说了再多也没用,只要看看代码就清楚了,呵呵.
      
   1CREATE PROCEDURE dbo.CreateSimple
   2(
   3 @PageIndex int,
   4 @PageSize int
   5)
   6AS
   7BEGIN
   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(0,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
  47END      由上面的注释就能看懂了,呵呵,既然写到这里也把程序的代码写出来:
   1Public ListSimple GetSimple(int pageIndex,int pageIndex,out int totalRecords){
   2  ListSimple entity=new ListSimple();
   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而导致错误.
  http://www.cnblogs.com/xdotnet/archive/2006/09/19/procedure_for_paging_select.html

来源:http://www.tulaoshi.com/n/20160219/1616525.html

延伸阅读
代码如下: Create procedure sp_pageQuery  @sqlstr nvarchar(4000), @page_index int, @page_size int , @rec_count int out -- as   set nocount on   declare @cursor_id int  declare @rowcount int  exec&nb...
    角色(数据库权限集)与存储过程、函数和数据包之间的交互方式是Oracle安全模型中最难以处理的一个部分。Oracle中的对象权限可以直接或通过角色间接授予用户。      假设一个HR用户向用户ABEL授予EMPLOYEES表的一些许可: GRANT select, insert, update, delete     这个语句直接...
  一、使用存储过程返回数据集 Oracle中存储过程返回数据集是通过ref cursor类型数据的参数返回的,而返回数据的参数应该是out或in out类型的。 由于在定义存储过程时无法直接指定参数的数据类型为:ref cursor,而是首先通过以下方法将ref cursor进行了重定义: create or replace package FuxjPackage is type Fuxj...
然而,在SQL Server 2005中,我们可以用.NET家族的语言——主要是VB.NET和C#来编写存储过程(以及方法、触发器和其它组件)。让我们来熟悉一下关于编写存储过程新方法的5个常见问题。它们是非常值得我们探讨的。 1、为什么我们必须使用CLR模式来编写存储过程呢? 主要原因是速度。SQL CLR在很多方式下都运行较快:比如字符串处理,...
标签: ASP
  建立表: CREATE TABLE [TestTable] ( [ID] [int] IDENTITY (1, 1) NOT NULL , [FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL , [Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL , [Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_...

经验教程

345

收藏

68
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部