分页存储过程调用遇到问题?

麻烦的一笔 2009-11-26 03:28:24
存储过程

ALTER PROCEDURE PagingHelper
@tableField varchar(200) = '*', --搜索表的字段
@tableName varchar(50), --搜索表名
@selectWhere varchar(500), --搜索条件
@selectID varchar(20), --表主键字段名,比如ID
@selectOrder varchar(200), --排序,可以使用多字段排序但主键字段必需在最前面.也可以不写,
--比如:order by CreateDate desc
@pageNo int = 1, --页号
@pageSize int = 2, --每页显示记录数
@totalCount int OUTPUT --总记录数,输出参数
AS
declare @tmpSelect varchar(600)
declare @tmp varchar(600)

set @tmpSelect = 'select @totalCount = count(*) from '+@tableName
exec sp_executesql @tmpSelect,
N'@totalCount int output', --执行sql语句,返回总记录数
@totalCount output
if(@totalCount = 0)
return 0
/* 判断页数是否正确 */
if((@pageNo -1) * @pageSize > @totalCount)
return (-1)

set @tmpSelect = 'select top ' +str(@pageSize)+ ' ' +@tableField+ ' from ' +@tableName+ ' where '
+ @selectID + ' not in (select top '+str((@pageNo-1)*@pageSize)+ ' ' +@selectID+ ' from ' +@tableName+
' '+@selectOrder+') '+@selectOrder
execute sp_executesql @tmpSelect
return(@@rowcount)

数据层调用
public DataView SelectAllNews(int pageNo, int pageSize, ref int totalCount) {
ConfigManager cm = new ConfigManager();
SqlDataAdapter sda = new SqlDataAdapter("PagingHelper", cm.DalConnectionString);
sda.SelectCommand.CommandType = CommandType.StoredProcedure;
sda.SelectCommand.Parameters.Add("@tableField", SqlDbType.VarChar, 200).Value = "*";
sda.SelectCommand.Parameters.Add("@tableName", SqlDbType.VarChar, 50).Value = "NewsItem";
//da.SelectCommand.Parameters.Add("@SelectWhere", SqlDbType.VarChar, 500).Value = "where d=1";
sda.SelectCommand.Parameters.Add("@selectID",SqlDbType.VarChar,20).Value="NewID";
sda.SelectCommand.Parameters.Add("@selectOrder",SqlDbType.VarChar,200).Value = "order by CreateDate desc";
sda.SelectCommand.Parameters.Add("@pageNo",SqlDbType.Int).Value = pageNo;
sda.SelectCommand.Parameters.Add("@pageSize", SqlDbType.Int).Value = pageSize;
//总记录数
sda.SelectCommand.Parameters.Add("@totalCount", SqlDbType.Int).Direction = ParameterDirection.Output;
//当前页的记录数
//sda.SelectCommand.Parameters.Add("CurrentPageCount", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
totalCount = Convert.ToInt32(sda.SelectCommand.Parameters.Add("@totalCount", SqlDbType.Int).Value);

DataSet ds = new DataSet();
sda.Fill(ds, "sel_news");
DataView dv = ds.Tables["sel_news"].DefaultView;
return dv;
}

提示错误:
过程 'PagingHelper' 需要参数 '@totalCount',但未提供该参数。 

各位帮我看看是什么原因啊?
...全文
122 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
igelf 2009-11-28
  • 打赏
  • 举报
回复
总数用方法获得太浪费了.我发你个试试.


CREATE PROCEDURE [dbo].[uspPageResult]
-- 获得某一页的数据 --
@tabName varchar(1000), --需要查看的表名 (即 from table_name)
@showColumn varchar(1000) , --需要得到的字段 (即 column1,column2,)
@ascColumn varchar(100) , --排序的字段名 (即 order by column asc/desc)
@bitOrderType bit = 0, --排序的类型 (0为升序,1为降序)
@strCondition varchar(4000) , --查询条件 (即 where condition) 不用加where关键字
@currPage int = 1 output, --当前页页码 (即Top currPage)
@pageSize int = 10, --分页大小
@intcount int output --返回总数

AS
BEGIN
-- 该存储过程需要用到的几个变量 --
DECLARE @strTemp varchar(1000)
DECLARE @strSql varchar(6000) --该存储过程最后执行的语句
DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)

BEGIN
set nocount on
declare @sql nvarchar(4000);
set @sql=N'select @intcount=count(*) from '+ @tabname +' where '+@strcondition;
exec sp_executesql @sql,N'@intcount int output ',@intcount output

declare @pageCount int;
set @pageCount=(@intcount-1)/@pagesize+1;
if(@currPage>@pageCount)
SET @currPage=@pageCount

IF @bitOrderType = 1 -- bitOrderType=1即执行降序
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'
SET @strTemp = '<(SELECT min'
END
ELSE
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'
SET @strTemp = '>(SELECT max'
END

IF @currPage = 1 -- 如果是第一页
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+@strOrderType
ELSE -- 其他页
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+' AND '+@ascColumn+@strTemp+'('+@ascColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+
' '+@ascColumn+' FROM '+@tabName+' WHERE '+@strCondition+@strOrderType+') AS TabTemp)'+@strOrderType
END

EXEC (@strSql)
END
麻烦的一笔 2009-11-28
  • 打赏
  • 举报
回复
7楼我试过,没效果,再次谢谢各位给予我帮助,,稍后结贴
wangminqi 2009-11-27
  • 打赏
  • 举报
回复
在服务器上,查询分析器,找到存储过程,点右键,点调试,F5,F10,F11,设置断点等,有点象Vs,你可以试试

在客户机上,需要一些设置才行(建议在服务器上调吧)

http://www.mybuffet.cn
麻烦的一笔 2009-11-27
  • 打赏
  • 举报
回复
又有错了,真是错误百出啊!现在的错误是“将数据类型 varchar 转换为 float 时出错。”
ALTER PROCEDURE PagingHelper
@tableField varchar(200) = '*', --搜索表的字段
@tableName varchar(50) = '', --搜索表名
@selectWhere varchar(500) = '', --搜索条件
@selectID varchar(20)='', --表主键字段名,比如ID
@selectOrder varchar(200)='', --排序,可以使用多字段排序但主键字段必需在最前面.也可以不写,
--比如:order by CreateDate desc
@pageNo int = 1, --页号
@pageSize int = 1, --每页显示记录数
@totalCount int OUTPUT --总记录数,输出参数
AS
declare @tmpSelect nvarchar(600)
declare @tmp nvarchar(600)

set @tmpSelect = 'select '+ str(@totalCount)+'=count(*) from ' +@tableName
--exec sp_executesql @tmpSelect,
--N'@totalCount int output', --执行sql语句,返回总记录数
--@totalCount OUTPUT
if(@totalCount = 0)
return 0
/* 判断页数是否正确 */
if((@pageNo -1) * @pageSize > @totalCount)
return (-1)

set @tmpSelect = 'select top ' +str(@pageSize)+' ' +@tableField+' from ' +@tableName+' where ' +@selectID+ ' not in (select top ' +str((@pageNo-1)*@pageSize)+' ' +str(@selectID)+' from '+@tableName+
' '+@selectOrder+') ' + @selectOrder
--execute sp_executesql @tmpSelect
return(@@rowcount)

public DataView SelectAllNews(int pageNo, int pageSize, ref int totalCount) {
ConfigManager cm = new ConfigManager();
SqlDataAdapter sda = new SqlDataAdapter("PagingHelper", cm.DalConnectionString);
sda.SelectCommand.CommandType = CommandType.StoredProcedure;
sda.SelectCommand.Parameters.Add("@tableField", SqlDbType.VarChar, 200).Value = "*";
sda.SelectCommand.Parameters.Add("@tableName", SqlDbType.VarChar, 50).Value = "NewsItem";
//da.SelectCommand.Parameters.Add("@SelectWhere", SqlDbType.VarChar, 500).Value = "where d=1";
sda.SelectCommand.Parameters.Add("@selectID",SqlDbType.VarChar,20).Value="NewID";
sda.SelectCommand.Parameters.Add("@selectOrder",SqlDbType.VarChar,200).Value = "order by CreateDate desc";
sda.SelectCommand.Parameters.Add("@pageNo",SqlDbType.Int).Value = pageNo;
sda.SelectCommand.Parameters.Add("@pageSize", SqlDbType.Int).Value = pageSize;
//总记录数
sda.SelectCommand.Parameters.Add("@totalCount", SqlDbType.Int).Direction = ParameterDirection.Output;
//当前页的记录数
//sda.SelectCommand.Parameters.Add("CurrentPageCount", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
totalCount = Convert.ToInt32(sda.SelectCommand.Parameters["@totalCount"].Value);

DataSet ds = new DataSet();
try
{
sda.Fill(ds, "sel_news");
DataView dv = ds.Tables["sel_news"].DefaultView;
return dv;
}
catch (Exception e) {
throw new Exception(e.Message);
}
}

用了存储过程不会调试,有错误直接返回catch,实在没办法了
igelf 2009-11-27
  • 打赏
  • 举报
回复
汗.你试过7楼的吗
happy664618843 2009-11-27
  • 打赏
  • 举报
回复
解决就好 gx 帮顶
麻烦的一笔 2009-11-27
  • 打赏
  • 举报
回复
终于解决了!我靠,不知道怎么搞的,我在存储过程里设置获取总记录数的sql语句没起作用,
然后我写在方法里就可以了
lemong 2009-11-26
  • 打赏
  • 举报
回复
@totalCount 从逻辑上说只能是单向输出阿

set @tmpSelect = 'select ' +@totalCount+' = count(*) from '+@tableName
------------
这里你改错了,varchar常量和int变量不能直接加
liangwansheng 2009-11-26
  • 打赏
  • 举报
回复
我是学java的,进错了,呵呵,顶一吧。
wangminqi 2009-11-26
  • 打赏
  • 举报
回复
还是改成7楼的吧,不然参数返回会出错
但str改成 cast

http://www.mybuffet.cn
YnSky 2009-11-26
  • 打赏
  • 举报
回复
Up.
wangminqi 2009-11-26
  • 打赏
  • 举报
回复
set @tmpSelect = 'select ' +@totalCount+' = count(*) from '+@tableName

把@totalCount转换成字符串, cast(@totalCount as varchar(10))
把所有str换成cast 试试

http://www.mybuffet.cn
igelf 2009-11-26
  • 打赏
  • 举报
回复

declare @tmpSelect nvarchar(600)
declare @tmp varchar(600)

set @tmpSelect = n'select @totalCount= count(*) from '+@tableName
exec sp_executesql @tmpSelect,N'@totalCount int output ',@totalCount output
--'@totalCount int output', --执行sql语句,返回总记录数
--@totalCount OUTPUT

麻烦的一笔 2009-11-26
  • 打赏
  • 举报
回复
刚才的问题解决了,现在出的问题根本就找不到错在哪
ALTER PROCEDURE PagingHelper
@tableField varchar(200) = '*', --搜索表的字段
@tableName varchar(50), --搜索表名
@selectWhere varchar(500) = '', --搜索条件
@selectID varchar(20), --表主键字段名,比如ID
@selectOrder varchar(200), --排序,可以使用多字段排序但主键字段必需在最前面.也可以不写,
--比如:order by CreateDate desc
@pageNo int = 1, --页号
@pageSize int = 2, --每页显示记录数
@totalCount int = 0 OUTPUT --总记录数,输出参数
AS
declare @tmpSelect varchar(600)
declare @tmp varchar(600)

set @tmpSelect = 'select ' +@totalCount+' = count(*) from '+@tableName
exec sp_executesql @tmpSelect
--'@totalCount int output', --执行sql语句,返回总记录数
--@totalCount OUTPUT
if(@totalCount = 0)
return 0
/* 判断页数是否正确 */
if((@pageNo -1) * @pageSize > @totalCount)
return (-1)

set @tmpSelect = 'select top ' +str(@pageSize)+ ' ' +@tableField+ ' from ' +@tableName+ ' where '
+ @selectID + ' not in (select top '+str((@pageNo-1)*@pageSize)+ ' ' +@selectID+ ' from ' +@tableName+
' '+@selectOrder+') '+@selectOrder
execute sp_executesql @tmpSelect
return(@@rowcount)

public DataView SelectAllNews(int pageNo, int pageSize, ref int totalCount) {
ConfigManager cm = new ConfigManager();
SqlDataAdapter sda = new SqlDataAdapter("PagingHelper", cm.DalConnectionString);
sda.SelectCommand.CommandType = CommandType.StoredProcedure;
sda.SelectCommand.Parameters.Add("@tableField", SqlDbType.VarChar, 200).Value = "*";
sda.SelectCommand.Parameters.Add("@tableName", SqlDbType.VarChar, 50).Value = "NewsItem";
//da.SelectCommand.Parameters.Add("@SelectWhere", SqlDbType.VarChar, 500).Value = "where d=1";
sda.SelectCommand.Parameters.Add("@selectID",SqlDbType.VarChar,20).Value="NewID";
sda.SelectCommand.Parameters.Add("@selectOrder",SqlDbType.VarChar,200).Value = "order by CreateDate desc";
sda.SelectCommand.Parameters.Add("@pageNo",SqlDbType.Int).Value = pageNo;
sda.SelectCommand.Parameters.Add("@pageSize", SqlDbType.Int).Value = pageSize;
//总记录数
sda.SelectCommand.Parameters.Add("@totalCount", SqlDbType.Int).Direction = ParameterDirection.Output;
//当前页的记录数
//sda.SelectCommand.Parameters.Add("CurrentPageCount", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
totalCount = Convert.ToInt32(sda.SelectCommand.Parameters["@totalCount"].Value);

DataSet ds = new DataSet();
sda.Fill(ds, "sel_news");
DataView dv = ds.Tables["sel_news"].DefaultView;
return dv;
}

提示错误:将 varchar 值 'select ' 转换为数据类型为 int 的列时发生语法错误。
aellonxie 2009-11-26
  • 打赏
  • 举报
回复
public DataView SelectAllNews(int pageNo, int pageSize, ref int totalCount) {

你写的方法不是有一个分页的size吗?
你赋值了?
没有值就挨个查,肯定是你的错,我比较相信计算机
lemong 2009-11-26
  • 打赏
  • 举报
回复
//da.SelectCommand.Parameters.Add("@SelectWhere", SqlDbType.VarChar, 500).Value = "where d=1";
--------------------
没有赋值,并且参数没有默认值,当然出错了
qqzeng-ip 2009-11-26
  • 打赏
  • 举报
回复
给参数赋值
zhuxiaojun2002 2009-11-26
  • 打赏
  • 举报
回复
public DataView SelectAllNews(int pageNo, int pageSize, out int totalCount) {
takako_mu 2009-11-26
  • 打赏
  • 举报
回复
檢查一下你的參數@totalCount是否為null

62,264

社区成员

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

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

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

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