.NET人字拖
万丈高楼平地起,我正在努力筑地基...
随笔- 133  文章- 0  评论- 606 
博客园  社区  首页  新随笔  联系  管理  订阅 订阅

在存储过程中实现分页.

     我不是一个很有经验的程序员,在做项目的过程中会遇到很多的问题,在数据库中使用分页就是我做项目中遇到的一个问题.我从网上查了很多资料,有很多种方法.但我觉的创建临时数据表是最简单的方法,在我做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(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
47END 
     由上面的注释就能看懂了,呵呵,既然写到这里也把程序的代码写出来:
 1Public 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而导致错误.


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

关于作者:网魂小兵

文章出处:http://xdotnet.cnblogs.com

本文可以随意转载,摘抄等非商业用途。

为了尊重作者成果,在转载和摘抄的时候请留下作者名称和出处。

绿色通道:好文要顶关注我收藏该文与我联系
posted @ 2006-09-19 21:23 网魂小兵 阅读(9604) 评论(27) 编辑 收藏
1526232
#1楼物质法则       在2006-09-24 22:35说:
能不能加上条件查询和排列
 回复 引用 查看   
#2楼[楼主]网魂小兵       在2006-09-25 09:38说:
@物质法则

可以加入条件查询和排列,
在插入表格时加入,这样就可以了!

 回复 引用 查看   
#3楼goalbell       在2006-12-27 14:43说:
可以发一下SqlHelper类的源代码给我吗?
goalbell@163.com
谢谢

 回复 引用 查看   
#4楼虫虫[未注册用户] 在2007-02-08 10:40说:
不错,收藏
 回复 引用   
#5楼gerry[未注册用户] 在2007-03-22 20:30说:
楼主可不可以发源文件,我最近用SqlHelper调有存储过程写分页,搞了两天没搞定。

看你上面代码还是没看太明白,如可以发到我邮箱suyuja@163.com感激。

 回复 引用   
#6楼[楼主]网魂小兵       在2007-03-23 09:26说:
@gerry

SqlHelper你可以参考一下PETSHOP的源代码,它只是数据库存储的一些简化类,即对SqlConnection/SqlCommand的封装。

 回复 引用 查看   
#7楼刘新春       在2007-06-08 15:49说:
按照你的代码 totalRecords=(int)param[2].Value 返回的总是空的值 不知道为什么

 回复 引用 查看   
#8楼刘新春       在2007-06-08 15:50说:
如果把
--获取我们所要的记录.
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]

这段代码去掉就可以取到totalRecords的值

 回复 引用 查看   
#9楼[楼主]网魂小兵       在2007-06-09 00:54说:
@刘新春

这个是我很早以前写的,我记得以前测试过,如果是totalRecords获取不到值,有可能是你的存储过程加入SET NOCOUNT ON!!!

去掉又能获得,是不是你的IDataReader没有关闭就取totalRecords...

 回复 引用 查看   
#10楼烈日下的小树       在2007-11-29 16:38说:
找不到类型或命名空间名称"Simple"(是否缺少 using指令或程序集引用)
找不到类型或命名空间名称“List“(是否缺少using指令或程序集引用)

我把这个和<GridView控件>自定义分页弄一块了。指点一下吧,我怎么也做不出来Gridview的分页

 回复 引用 查看   
#11楼ooo[未注册用户] 在2008-03-27 12:07说:
qweqwe
 回复 引用   
#12楼流浪       在2008-04-28 13:17说:
http://www.cnblogs.com/xdotnet/archive/2006/09/19/procedure_for_paging_select.html
 回复 引用 查看   
#13楼没有钱的职业[未注册用户] 在2008-06-13 16:50说:
这样写性能有测试过吗?好像不大好吧。记得几年前我也这样写过。
现在这样写:alter procedure cr_test @returnCount int =10 , @pageint int =1 , @recordeCount int out
as
declare @hascount int ,
@sqlstr nvarchar(500)

set @hascount= @returnCount*(@pageint-1)
set @sqlstr=N'SELECT top '+cast(@returnCount as varchar)+' [TypeID],[vindicateCode] FROM [aaaaa]
where typeid not in (select top '+cast( @hascount as varchar)+' [TypeID] from [aaaaa] order by typeid)
order by typeid
'


select @recordeCount = CEILING( cast( count(*) as numeric(8,1)) /@returnCount) FROM [aaaaa]

execute sp_executesql @sqlstr, N'@returnCount int , @pageint int ',
@returnCount , @pageint


 回复 引用   
#14楼123fazsdfasdf[未注册用户] 在2008-11-15 14:58说:
@没有钱的职业
你写的 根本是垃圾啊啊
你自己看看MemberShip 类 是怎么写的

 回复 引用   
#15楼123fazsdfasdf[未注册用户] 在2008-11-15 14:58说:
@没有钱的职业
你写的 根本是垃圾啊啊
你自己看看MemberShip 类 是怎么写的

 回复 引用   
#16楼winsty[未注册用户] 在2009-03-02 15:46说:
在C#中如何接收 总记录 int值 和 dataset

 回复 引用   
#17楼晓风残月       在2009-03-03 17:31说:
至少还可以优化的是
1. 用表变量不用临时表
2. 写入临时表可以加上 TOP 或者 ROWCOUNT 来返回 PageIndex+1 * PageSize

 回复 引用 查看   
#18楼大幅度过分第三[未注册用户] 在2009-03-28 16:55说:
以下是我的写法
create proc PageIndex
@pagesize int,@currentpageIndex int
as
declare @sql nvarhcar(200)
set @sql =' Select Top'+convert(varchar(10),@pagesize)+
'* from 数据库名称 where id not in(select Top '+convert(varchar(10),@currentpageIndex-1)*@pagesize)+'id from 数据库名称 order by id asc) order by id asc'

exec sp_executesql @sql
go

如果再加上一个like条件,本人就不知道了,请大家帮忙解决一下!!!!

 回复 引用   
#19楼yxd365936812[未注册用户] 在2009-04-01 10:21说:
我是懒人 可以把完整的代码 发给我下吗? 谢谢咯
zxc_001.com@qq.com

 回复 引用   
#20楼adfss[未注册用户] 在2009-05-06 19:48说:
可不可以把代码发给我看一下。完整的代码。我做了下,没出来效果。
我的邮箱是598486319@qq.com

 回复 引用   
#21楼lushang 在2009-05-12 21:33说:
能不能给我发份源码?zlq123580@126.com
 回复 引用   
注册用户登录后才能发表评论,请 登录 或 注册,返回博客园首页。
首页博问闪存新闻园子招聘知识库
最新IT新闻:
· 最想要的Entity Framework功能
· 专访Jeffrey Richter:Windows 8是微软的重中之重
· 《福布斯》:谷歌进军硬件产品 难撼动苹果地位
· 美国空军拟最多购买1.8万台iPad 2
· 分析称专利之争让谷歌苹果两败俱伤
» 更多新闻...
最新知识库文章:
· 高级编程语言的发展历程
· 如何学习一门新的编程语言?
· 学习不同编程语言的重要性
· 为什么我喜欢富于表达性的编程语言
· 计算机专业的女生为什么要学编程
» 更多知识库文章...

China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
Copyright ©2012 网魂小兵
Name:
网魂小兵
Addr:
福建厦门
MSN:
myxbing#hotmail.com
昵称:网魂小兵
园龄:5年11个月
粉丝:23
关注:0

搜索

 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我的参与
  • 最新评论
  • 我的标签
  • 更多链接

我的标签

  • directx11(6)
  • direct3d 11(6)
  • 游戏编程(6)
  • c/c++(6)
  • vs2010(5)
  • wpf(4)
  • openssl(2)
  • direct3d坐标系(2)
  • vs2008(2)
  • xaml(2)
  • 更多

随笔分类(170)

  • AJAX(doc)(8)
  • ASP.NET(46)
  • C#3.0+(13)
  • C/C++(27)
  • CommunityServer(7)
  • Database(11)
  • Enterprise Library (7)
  • JavaScript(10)
  • ServerContols(7)
  • UML(1)
  • VC++/MFC(8)
  • WPF/SilverLight(6)
  • XNA Game(2)
  • 翻译(4)
  • 今天我当家(11)
  • 设计模式(2)

随笔档案(133)

  • 2012年2月 (3)
  • 2011年8月 (3)
  • 2011年7月 (7)
  • 2011年5月 (1)
  • 2011年4月 (2)
  • 2011年2月 (1)
  • 2010年1月 (1)
  • 2009年3月 (3)
  • 2009年1月 (8)
  • 2008年3月 (1)
  • 2008年2月 (3)
  • 2008年1月 (1)
  • 2007年11月 (4)
  • 2007年10月 (3)
  • 2007年9月 (9)
  • 2007年8月 (3)
  • 2007年7月 (2)
  • 2007年6月 (9)
  • 2007年5月 (9)
  • 2007年4月 (14)
  • 2007年3月 (6)
  • 2007年2月 (3)
  • 2007年1月 (15)
  • 2006年12月 (9)
  • 2006年11月 (2)
  • 2006年10月 (4)
  • 2006年9月 (7)

文章分类

  • Asp.Net(.NET)

I Like Links

  • ASP.NET
  • Codeplex
  • XNADevelopment

My Friend's Blog

  • 陆巍杰
  • 孙小雨
  • 探丫头
  • 网络安全&Linux

积分与排名

  • 积分 - 283912
  • 排名 - 248

最新评论

阅读排行榜

评论排行榜