在使用存储过程中怎么获得总页数和总记录数?

arorn 2009-10-12 10:23:58
存储过程:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go


-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[PF_PageControl]
@tableName varchar(500), -- 表名
@tableFields varchar(5000) = '*', -- 字段名(全部字段为*)
@sqlWhere varchar(5000) = NULL, -- 条件语句(不加 where,可带 group by 分组条件,分组条件需要带 group by 关键字)
@orderFields varchar(5000), -- 排序字段(必须,支持多字段,不加 order by)
@pageSize int, -- 页大小(每页多少条记录)
@pageIndex int = 1 , -- 指定当前为第几页
@totalPage int output -- 返回总页数
AS
BEGIN
Begin Tran -- 开始事务

Declare @sql nvarchar(4000);
Declare @totalRecord int;

-- 计算总记录数
if (@sqlWhere = '' or @sqlWhere = NULL)
set @sql = 'select @totalRecord = count(0) from ' + @tableName
else
BEGIN
if(CHARINDEX('group by', LOWER(@sqlWhere)) > 0)
set @sql = 'select @totalRecord = count(0) from (select ' + @tableFields + ' from ' + @tableName + ' where ' + @sqlWhere + ') as Tab_GroupTable'
else
set @sql = 'select @totalRecord = count(0) from ' + @tableName + ' where ' + @sqlWhere
END

--print @Sql

EXEC sp_executesql @sql,N'@totalRecord int OUTPUT',@totalRecord OUTPUT

-- 计算总页数
select @totalPage=CEILING((@totalRecord+0.0)/@pageSize)

-- 处理页数超出范围情况
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

-- 合成sql语句
if (@sqlWhere = '' or @sqlWhere = NULL)
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @orderFields + ') as rowId,' + @tableFields + ' from ' + @tableName
else
set @sql = 'Select * FROM (select ROW_NUMBER() Over(order by ' + @orderFields + ') as rowId,' + @tableFields + ' from ' + @tableName + ' where ' + @sqlWhere

set @Sql = @Sql + ') as Tab_TotalTable where rowId between ' + Convert(varchar(50),@startRecord) + ' and ' + Convert(varchar(50),@endRecord)

print @Sql

Exec(@Sql)

if @@Error <> 0
BEGIN
RollBack Tran
Return -1
END
else
BEGIN
Commit Tran
Return @totalRecord --- 返回记录总数
END
END



DAL:

#region 读取产品数据分页
/// <summary>
/// 读取产品数据分页
/// </summary>
/// <param name="getpage"></param>
/// <param name="sql"></param>
/// <returns></returns>
public SqlDataReader GetProductList(Model.S_page getpage,string sql) {

return SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.StoredProcedure, sql,
new SqlParameter("@tableName", getpage.tableName),
new SqlParameter("@tableFields", getpage.strGetFields),
new SqlParameter("@sqlWhere", getpage.strWhere),
new SqlParameter("@orderFields", getpage.orderType),
new SqlParameter("@pageSize", getpage.pageSize),
new SqlParameter("@pageIndex", getpage.pageIndex),
new SqlParameter("@totalPage",ParameterDirection.Output)

);
}

#endregion

BLL:

public SqlDataReader GetProductlist(S_page spage, string sql)
{
return db.GetProductList(spage, sql);
}

Web:

//读取数据

GetPage.tableName = "S_Product";
GetPage.fldname = "sid";
GetPage.orderType = "sid desc";
GetPage.pageIndex = IntPage;
GetPage.pageSize = pagesize;
GetPage.strGetFields = " sid,s_sort,s_sort2,s_title,s_price,s_link,s_content,s_pic";
GetPage.doCount = 0;
GetPage.strWhere = " 1=1 " + strwhere;
this.ProductList.DataSource = db.GetProductlist(GetPage, "PF_PageControl");
this.ProductList.DataBind();

我现在能读取到数据,但不知道怎么把总页数,和总记录数也读取出来显示在页面上,请教各位高手了指点一下
...全文
163 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
arorn 2009-10-12
  • 打赏
  • 举报
回复

public SqlDataReader GetProductList(Model.S_page getpage,string sql) {

return SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.StoredProcedure, sql,
new SqlParameter("@tableName", getpage.tableName),
new SqlParameter("@tableFields", getpage.strGetFields),
new SqlParameter("@sqlWhere", getpage.strWhere),
new SqlParameter("@orderFields", getpage.orderType),
new SqlParameter("@pageSize", getpage.pageSize),
new SqlParameter("@pageIndex", getpage.pageIndex),
new SqlParameter("@totalPage",ParameterDirection.Output)

);
}


这里应该怎么啊?
arorn 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 viewstates 的回复:]
你再加两个SELECT @TOTALRECORD和SELECT @totalPage不就可以了么?
你的DATAREADER中的NEXTRECORD就可以读取到这两个数据了。
[/Quote]
请问下,具体代码现在写啊?
ccsnetmm 2009-10-12
  • 打赏
  • 举报
回复
int ccs= int.Parse(cmd.Parameters["@totalPage"].Value.ToString());
CloneCenter 2009-10-12
  • 打赏
  • 举报
回复
可以在存储过程中增加两个 OUTPUT 参数,用于得到总页数和当前页数。
liujintaozyc 2009-10-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 viewstates 的回复:]
你再加两个SELECT @TOTALRECORD和SELECT @totalPage不就可以了么?
你的DATAREADER中的NEXTRECORD就可以读取到这两个数据了。
[/Quote]
支持下
randomfeel 2009-10-12
  • 打赏
  • 举报
回复
你能取到数据了,通过判断数据的行数不就得到总记录数了么
再通过pagesize的值,除一下,就得到总页数啦
ViewStates 2009-10-12
  • 打赏
  • 举报
回复
你再加两个SELECT @TOTALRECORD和SELECT @totalPage不就可以了么?
你的DATAREADER中的NEXTRECORD就可以读取到这两个数据了。

62,047

社区成员

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

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

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

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