问一个简单的方法,关于分页

WWWDJ1983 2008-01-31 09:24:40
数据查询之分页查询,一般有两种:
第一种,一次读出所有的数据,然后在客户端显示时提供分页
第二种,编写一个分页存储过程,对数据库查询时,即可分页查询

下面这个分页的存储过程在界面层怎么调用的,winform的
最好能有个例子,初次接触winform;先谢过各位;

CREATE PROCEDURE PageList
@tablename varchar(100),
@fields varchar(800),@condition varchar(8000),
@orderfield varchar(100),@ordertype varchar(100),
@pagesize int,@PageNo int

AS
declare @SQL varchar(8000)

if (@ordertype = 'Desc ')
begin
if (@condition = 'None ')
begin
if (@PageNo = 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + '

Order By '+ @orderfield + ' Desc '
end
if (@PageNo > 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + '

Where '+ @orderfield + ' <(Select Min( '+ @orderfield + ') From (Select Top '+ cast(@pagesize * (@PageNo - 1) as varchar(50)) + ' '+ @orderfield

+ ' From '+ @tablename + ' Order By '+ @orderfield + ' Desc) Temp) Order By '+ @orderfield + ' Desc '
end
end
else
begin
if (@PageNo = 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + ' '+ @condition + ' Order By '+ @orderfield + ' Desc '
end
if (@PageNo > 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + ' '+ @condition + ' And '+ @orderfield + ' <(Select Min( '+ @orderfield + ') From (Select Top '+ cast(@pagesize * (@PageNo - 1) as varchar(50)) + ' '+ @orderfield + ' From '+ @tablename + ' '+ @condition + ' Order By '+ @orderfield + ' Desc) Temp) Order By '+ @orderfield + ' Desc '
end
end
end
else if (@condition = 'None ')
begin
if (@PageNo = 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + ' Order By '+

@orderfield + ' Asc '
end
if (@PageNo > 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + ' Where '+

@orderfield + '> (Select Max( '+ @orderfield + ') From (Select Top '+ cast(@pagesize * (@PageNo - 1) as varchar(50)) + ' '+ @orderfield + ' From '+

@tablename + ' Order By '+ @orderfield + ' Asc) Temp) Order By '+ @orderfield + ' Asc '
end
end
else
begin
if (@PageNo = 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + ' '+

@condition + ' Order By '+ @orderfield + ' Asc '
end
if (@PageNo > 1)
begin
set @SQL= 'Select Top '+cast(@pagesize as varchar(50)) + ' '+ @fields + ' From '+ @tablename + ' '+

@condition + ' And '+ @orderfield + '> (Select Max( '+ @orderfield + ') From (Select Top '+ cast(@pagesize * (@PageNo - 1) as varchar(50)) + ' '+

@orderfield+ ' From '+ @tablename + ' '+ @condition + ' Order By '+ @orderfield + ' Asc) Temp) Order By '+ @orderfield + ' Asc '
end
end
exec (@SQL)
GO

...全文
178 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
royrandy 2008-02-01
  • 打赏
  • 举报
回复
建议楼主多看下书。
junval 2008-02-01
  • 打赏
  • 举报
回复

CREATE PROCEDURE UP_GetRecordByPage
@tblName varchar(255), -- 表名
@fldName varchar(255), -- 主标识
@PageSize int = 10, -- 页大小
@PageIndex int = 1, -- 页码
@IsReCount bit = 0, -- 返回总记录数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1000) = '' -- 查询条件 (注意: 不要加 where)
AS

declare @strSQL varchar(6000) -- 主语句
declare @strTmp varchar(100) -- 临时语句
declare @strOrder varchar(400) -- 排序类型

if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'
+ @strOrder

if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

if @PageIndex = 1
begin
set @strTmp =''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere

set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
+ @tblName + ']' + @strTmp + ' ' + @strOrder
end

if @IsReCount != 0
set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere

exec (@strSQL)

GO
lwlfree 2008-01-31
  • 打赏
  • 举报
回复
mark,做个标记,用下 AspnetPager.dll 控件,现在最新版本是 7.0.2
caicoko 2008-01-31
  • 打赏
  • 举报
回复
看看我的组件调用方法,比较简单
http://www.36510.com/control/code/Caicai_Control_CPage.html

在这里下载http://www.36510.com/Control/index.html
silkstockings 2008-01-31
  • 打赏
  • 举报
回复
/****** 分页存储过程 ******/

CREATE PROCEDURE Lcpager


@PageSize int, --每页记录数
@CurrentPage int, --当前页,0表示第1页
@AllTables varchar(255), --表名
@KeyID varchar(255), --主键
@Filter varchar(2000), --条件,可以为空,不用填 where
@Order VARCHAR(255) = '' --排序,可以为空,为空默认按主键升序排列,不用填 order by


AS
begin
IF @Filter = ''
SET @Filter = ' 1=1'
ELSE
SET @Filter = @Filter

DECLARE @pos1 varchar(100)
set @pos1 = @PageSize * @CurrentPage

declare @strTop varchar(200)
set @strTop = str(@PageSize)





exec (

'SELECT TOP '+@strTop+' * FROM '+@AllTables+' as t
WHERE
('+@KeyID+' NOT IN (SELECT TOP '+@pos1+' '+@KeyID+' FROM '+@AllTables +' as t where ' +@Filter +' ORDER BY '+@Order+'))
and '
+@Filter+
' ORDER BY '+@Order+' '
)


end
GO


我这个我觉得简单一些 我一直在用

汇仁肾宝她好我也好!
wxg22526451 2008-01-31
  • 打赏
  • 举报
回复
mark
rangeon 2008-01-31
  • 打赏
  • 举报
回复
学习
jimu8130 2008-01-31
  • 打赏
  • 举报
回复
相信如何调用存储过程你应该会做吧,这个仅仅是数据库操作,和界面什么的没关联。如果不会做,那么建议你用google搜索一下,代码到处是,既然你能搜索到这个存储过程,搜索怎么调用还不是小case

fancystyle 2008-01-31
  • 打赏
  • 举报
回复
http://www.cnblogs.com/weipengyang/archive/2006/02/28/339798.html

http://www.cnblogs.com/Dragon-China/archive/2007/03/06/665180.html

自己不会搜啊.看上面的吧,差不多都一个意思
yaoleshi 2008-01-31
  • 打赏
  • 举报
回复
标准分页 存储过程
lz应该多给点分哟
yaoleshi 2008-01-31
  • 打赏
  • 举报
回复
create PROCEDURE pagination
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) = '*', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@pagecount int output, -- 返回页总数, 非 0 值则返回
--@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '1=1' -- 查询条件 (注意: 不要加 where)
AS
declare @sql nvarchar(2000)
--获得表中所有记录的条数
declare @recordcount int
declare @getcountsql nvarchar(2000)
set @getcountsql = N'select @count = count(*) from ' + @tblName + N' where '
+ @strWhere
exec sp_executesql @getcountsql,N'@count int output',@count=@recordcount output
if @recordcount=0
begin
set @pagecount = 0
return
end
declare @lastcount int
set @lastcount = @recordcount % @PageSize
if @lastcount = 0
set @pagecount = @recordcount / @PageSize
else
set @pagecount = @recordcount / @PageSize + 1



if @lastcount = 0 or @pageindex < @pagecount
begin
set @sql = N'select ' + @strGetFields + N' from (select top ' + convert(nvarchar(4),@PageSize) +
N' * from (select top ' + convert(varchar(10),@PageSize*@PageIndex) + N' * from ' +
@tblName + N' where ' + @strWhere + N' order by ' +@fldName+ N') as t order by ' + @fldName +
' desc) as tt order by ' + @fldName
end
else
begin
if @lastcount != 0 and @pageindex = @pagecount
begin
set @sql = N'select ' + @strGetFields + N' from (select top ' + convert(nvarchar(4),@lastcount) +
N' * from (select top ' + convert(varchar(10),@PageSize*@PageIndex) + N' * from ' +
@tblName + N' where ' + @strWhere + N' order by ' +@fldName+ N') as t order by ' + @fldName + ' desc) as tt order by ' + @fldName
end
end
print @sql
exec sp_executesql @sql
go
declare @pagecount int
exec pagination 'authors','*','au_id',5,1, @pagecount output,'state=''CA'''
print @pagecount


e_god 2008-01-31
  • 打赏
  • 举报
回复
http://blog.csdn.net/renyanbinnet/archive/2007/12/22/1958604.aspx
参考一下吧
WWWDJ1983 2008-01-31
  • 打赏
  • 举报
回复
楼上的大哥,写个简单事例行吗?
fancystyle 2008-01-31
  • 打赏
  • 举报
回复
和WINFORM WEBFORM没关系.

就是你在翻页的时候,把pageIndex之类的参数传给存储过程.
可以搜个WEB的DATAGRID之类的存储过程分页代码参考下就明白了
wdzr_826 2008-01-31
  • 打赏
  • 举报
回复
建议你下一个webdiyer分页控件
wdzr_826 2008-01-31
  • 打赏
  • 举报
回复
分页存储过程最优,网上有很多这类存储过程。

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧