关于分页的一些问题

shy06858 2009-06-01 05:11:08
我在写一个系统,这个系统里用到大量的查询,都需要分页,我在网上找了一些,很多都是要写存储过程,如果我有200个GridView需要分页,那我就要写200个存储过程,这样也太烦人了。
谁能告诉我一个比较高效并且不需要写太多的存储过程的[通用分页类]啊??
谢谢各位了!
...全文
109 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwm520lj 2009-06-02
  • 打赏
  • 举报
回复
国外的分页代码




-- ???????????
-- ???????????
-- ???????????
-- ???????????
--region [dbo].[pro_Alarm_Type_SelectPagedDynamic]

------------------------------------------------------------------------------------------------------------------------
-- Generated By: Administrator using CodeSmith 4.0.0.0
-- Template: StoredProcedures.cst
-- Procedure Name: [dbo].[pro_Alarm_Type_SelectPagedDynamic]
-- Date Generated: 2009年4月13日
------------------------------------------------------------------------------------------------------------------------

CREATE PROCEDURE [dbo].[pro_Alarm_Type_SelectPagedDynamic]
@PageSize int, --页面大小
@PageIndex int, --第几页
@WhereCondition nvarchar(500) = NULL,
@OrderByExpression nvarchar(250) = NULL
AS

--SET NOCOUNT ON
--SET TRANSACTION ISOLATION LEVEL READ COMMITTED


DECLARE @SQL nvarchar(3250)

SET @SQL = '
with TempTBL as (
SELECT ROW_NUMBER() OVER (ORDER BY '
IF @OrderByExpression IS NOT NULL AND LEN(@OrderByExpression) > 0
BEGIN
SET @SQL = @SQL + @OrderByExpression
END
Else
Begin
SET @SQL = @SQL + ' Alarm_TypeID '
End
SET @SQL = @SQL + ' )AS Row, * from [dbo].[Alarm_Type]'
IF @WhereCondition IS NOT NULL AND LEN(@WhereCondition) > 0
BEGIN
SET @SQL = @SQL + ' Where ' + @WhereCondition
End
SET @SQL = @SQL +')
SELECT * FROM TempTBL where Row between ' + Str((@PageIndex-1)*@PageSize+1) + ' and ' + Str((@PageIndex-1)*@PageSize+@PageSize)

IF @OrderByExpression IS NOT NULL AND LEN(@OrderByExpression) > 0
BEGIN
SET @SQL = @SQL + '
ORDER BY
' + @OrderByExpression
END
Else
Begin
SET @SQL = @SQL + ' ORDER BY Alarm_TypeID '
End

EXEC sp_executesql @SQL

--select @SQL


--endregion



GO
nosuchtracter 2009-06-02
  • 打赏
  • 举报
回复
网上很多,都是拼SQL语句的,写一个就行了
shy06858 2009-06-02
  • 打赏
  • 举报
回复
怎么取这个值Return @totalRecord ---返回记录总数
shy06858 2009-06-02
  • 打赏
  • 举报
回复
一个存储过程返回了一个表和一个值,请问怎么同时取到这个表和这个值啊
yan286093636 2009-06-02
  • 打赏
  • 举报
回复
在来一个吧,绝对通用的,效率客观................

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

declare @strSQL varchar(2000) -- 主语句
declare @strTmp varchar(1000) -- 临时变量
declare @strOrder varchar(1000) -- 排序类型

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 @IsCount != 0
set @strSQL = "select count(*) as Total from [" + @tblName + "]"

exec (@strSQL)
GO
qq196260188 2009-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhanglei5415 的回复:]
一个分页存储过程就够了,可以将你要查询的表的表名,字段,查询条件,排序方式等作为参数传进去,再由存储过程返回你要的结果集
[/Quote]

同理,,正确
zhongxingqiche 2009-06-02
  • 打赏
  • 举报
回复
不用写200多个存储,写一个能运用在多个表或者试图的就可以了,将表的名字或者试图的名字作为参数!!!
shy06858 2009-06-02
  • 打赏
  • 举报
回复
我现在把上面给的那个操作下,成功后给分
Jelly_tracy 2009-06-01
  • 打赏
  • 举报
回复
学习
sforiz 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mengxj85 的回复:]
网上很多的,在SQL板块里很多很好的,直接调用就行了,管他多与不多的
[/Quote]

写个适当的函数
mengxj85 2009-06-01
  • 打赏
  • 举报
回复
网上很多的,在SQL板块里很多很好的,直接调用就行了,管他多与不多的
gui0605 2009-06-01
  • 打赏
  • 举报
回复
如果你这样想,有多少个GridView就要写多少个存储过程来分页,那程序员可以不必混了
实际上一个数据库一般只需要一个分页存储过程就可以,再配合吴旗娃的分页控件就非常好用。
下面给你一个分页存储过程,SQL适用:

-- =============================================
-- 作者: <Jason>
-- 创建时间: <2007-9-05>
-- 描述: <高效分页存储过程,仅适用于Sql2005>
-- Notes: <排序字段强烈建议建索引>
-- =============================================
Create Procedure [dbo].[DataPage]
@TableName varchar(50), --表名
@Fields varchar(5000) = '*', --字段名(全部字段为*)
@OrderField varchar(5000), --排序字段(必须!支持多字段)
@sqlWhere varchar(5000) = Null,--条件语句(不用加where)
@pageSize int, --每页多少条记录
@pageIndex int = 1 , --指定当前为第几页
@TotalPage int output, --返回条数
@OrderType bit -- 设置排序类型,1 升序 0 值则降序
as
begin
declare @strOrder varchar(400) -- 排序类型

Begin Tran --开始事务
Declare @sql nvarchar(4000);
Declare @totalRecord int;
--计算总记录数
if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'select @totalRecord = count(*) from ' + @TableName
else
set @sql = 'select @totalRecord = count(*) from ' + @TableName + ' where ' + @sqlWhere
EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT--计算总记录数

--计算总页数

select @TotalPage=@totalRecord --CEILING((@totalRecord+0.0)/@PageSize)

if @OrderType = 0
begin
set @strOrder = ' order by [' + @OrderField +'] desc'
--如果@OrderType是0,就执行降序,这句很重要!
end
else
begin
set @strOrder = ' order by [' + @OrderField +'] asc'
end

if (@SqlWhere ='''' or @SqlWhere='' or @sqlWhere is NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over( '+@strOrder+' ) as rowId,' + @Fields + ' from ' + @TableName + ' where ' + @SqlWhere
--处理页数超出范围情况
if @PageIndex<=0
Set @pageIndex = 1

if @pageIndex>@TotalPage
Set @pageIndex = @TotalPage

--处理开始点和结束点
Declare @StartRecord int
Declare @EndRecord int

set @StartRecord = (@pageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @pageSize - 1

if @OrderType = 0
begin
set @strOrder = ' order by rowid desc'
--如果@OrderType是0,就执行降序,这句很重要!
end
else
begin
set @strOrder = ' order by rowid asc'
end
--继续合成sql语句
set @Sql = @Sql + ') as ' + @TableName + ' where rowId between ' + Convert(varchar(50),@StartRecord) + ' and ' + Convert(varchar(50),@EndRecord) + ' '+@strOrder
-- print @sql
Exec(@Sql)
---------------------------------------------------
If @@Error <> 0
Begin
RollBack Tran
Return -1
End
Else
Begin
Commit Tran
Return @totalRecord ---返回记录总数
End
end
sayoath 2009-06-01
  • 打赏
  • 举报
回复
只要写一个存储过程就好。。
可以控制参数、。、

也就是传来的值。。如果实现搞不懂。。
就加一个TYPEID 根据传来的ID值 来判断执行哪条语句。
hujunyi1111 2009-06-01
  • 打赏
  • 举报
回复
不用,只要写一分页个存储过程就行了。
yechd 2009-06-01
  • 打赏
  • 举报
回复
应该换成row_number吧
lvsh870228 2009-06-01
  • 打赏
  • 举报
回复
应用数据库分页啊:oracle有个什么column_num,你查查,其他的好像都有!
Wilson咻咻咻 2009-06-01
  • 打赏
  • 举报
回复
顶四楼!!!
WeekWant 2009-06-01
  • 打赏
  • 举报
回复
几乎就帮你写好了,逻辑就是如此了~~
细节自己补上

--@m_SQL = select Table.* from Table
CREATE PROCEDURE [dbo].[SP_Query]
@PageSize int,
@PageIndex int,
@m_SQL varchar(8000)
AS
BEGIN
DECLARE @MinTop AS int
DECLARE @MaxTop AS int

SELECT @MinTop = @PageSize*@PageIndex
SELECT @MaxTop = @PageSize*(@PageIndex+1)

select @m_SQL = @m_SQL + 'where p.PID>@MinTop and p.PID<@MaxTop'
EXEC(@m_SQL)
END
ReyZhang 2009-06-01
  • 打赏
  • 举报
回复
一个分页存储过程就够了,可以将你要查询的表的表名,字段,查询条件,排序方式等作为参数传进去,再由存储过程返回你要的结果集
shy06858 2009-06-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 WeekWant 的回复:]
这要看你的工程要求了,总的来说还是用存储过程。
根据需求写几个,不是200个。

就是参数化你的不一样的地方。
比如SQL文,可以使一个存储过程的参数。
GridView第几页是你的参数。
查询几条数据是你的参数。

那么这样就可以把这个存储过程共通化了~~
[/Quote]

可以给个具体的解决方案吗?我大概有100来个页面用到GridView需要分页,请问该在吗实现?
加载更多回复(1)

62,046

社区成员

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

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

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

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