c# mysql分页存储过程_C#中常用的分页存储过程

这篇博客介绍了如何在C#中使用MySQL分页存储过程,包括创建存储过程的步骤和示例代码。通过示例展示了如何根据不同的排序方式、条件和页码获取数据,并提供了处理页数超出范围的逻辑。还提供了一个名为SqlPager的通用分页存储过程示例。
摘要由CSDN通过智能技术生成

CREATE Procedure FramWorkPage

@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

SELECT TOP 10 *

FROM TestTable

WHERE (ID >

(SELECT MAX(id)

FROM (SELECT TOP 20 id

FROM TestTable

ORDER BY id) AS T))

ORDER BY ID

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID >

(SELECT MAX(id)

FROM (SELECT TOP 页大小*页数 id

FROM 表

ORDER BY id) AS T))

ORDER BY ID

SELECT TOP 10 *

FROM TestTable

WHERE (ID NOT IN

(SELECT TOP 20 id

FROM TestTable

ORDER BY id))

ORDER BY ID

SELECT TOP 页大小 *

FROM TestTable

WHERE (ID NOT IN

(SELECT TOP 页大小*页数 id

FROM 表

ORDER BY id))

ORDER BY ID

create procedure SqlPager

@sqlstr nvarchar(4000), --查询字符串

@currentpage int, --第N页

@pagesize int --每页行数

as

set nocount on

declare @P1 int, --P1是游标的id

@rowcount int

exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output

select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页

set @currentpage=(@currentpage-1)*@pagesize+1

exec sp_cursorfetch @P1,16,@currentpage,@pagesize

exec sp_cursorclose @P1

set nocount off

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值