asp.net 存储过程,我要返回记录集,和记录总数

zsyok 2009-10-13 01:05:56

create proc ok
@pagesize int,
@pageindex int,
@pagetable nvarchar(50),
@RecordTotal int output
as
declare @sql nvarchar(500)
declare @StrTotalSQL nvarchar(500)

set @StrTotalSQL='select @RecordTotal=count(*) from t1'
-- '+@RecordTotal+'=

begin
set @sql='select top '+str(@pagesize)+' * from '+@pagetable+' where userid not in(select top '+str(@pagesize*(@pageindex-1))+' userid from '+@pagetable+')'
end

execute(@sql)
execute(@StrTotalSQL)
--我要返回记录集,和记录总数。我调用不了,这个记录总数,是不是写错了什么,定还是,我调用有问题?希望有人指点。

...全文
336 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ny-6000 2009-10-13
  • 打赏
  • 举报
回复
另一方面,既然使用了存储过程,就返回两个表得了,

一个是数据表,一个是记录数量表(尽管此表仅一行一列),

这样就可以一次返回了

Ny-6000 2009-10-13
  • 打赏
  • 举报
回复
set @StrTotalSQL='select @RecordTotal=count(*) from t1'

如果不需要拼接语句,干吗这样呢.

直接

select @RecordTotal=count(*) from t1

不就行了吗?----------建议先这样写试试
wuyq11 2009-10-13
  • 打赏
  • 举报
回复
CREATE Proc PageShowOne
@PageSize int=10 ,
@PageCurrent int=1 ,
@FdName varchar(100)='' ,
@SelectStr varchar(2000)='',
@FromStr varchar(1000)='',
@WhereStr varchar(2000)='',
@OrderByStr varchar(1000)='',
@CountRows int=0 output,
@CountPage int=0 output
as
declare @Id1 varchar(20),@Id2 varchar(20)
declare @OrderBySqls varchar(1000)
declare @WhereSqls varchar(2000)
declare @Sqls nvarchar(4000)
declare @TmpStr varchar(2000)
if @OrderByStr <> ''
set @OrderBySqls = ' order by '+@OrderByStr
else
set @OrderBySqls = ''
if @WhereStr <> ''
set @WhereSqls = ' where ('+@WhereStr+')'
else
set @WhereSqls = ''
set @TmpStr = @WhereSqls
if @PageCurrent<=1
begin
select @Id1=cast(@PageSize as varchar(20))
exec('select top '+@Id1+' '+@SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls)
goto LabelRes
end
select @Id1=cast(@PageSize as varchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))
if @WhereSqls <> ''
set @WhereSqls = @WhereSqls + ' and (' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+'))'
else
set @WhereSqls = ' where ' + @FdName+' not in(select top '+@Id2+' '+@FdName+' from '+@FromStr+@WhereSqls+@OrderBySqls+')'

set @Sqls = 'select top '+@Id1+ ' '+ @SelectStr+' from '+@FromStr+@WhereSqls+@OrderBySqls
exec (@Sqls)


set @Sqls = 'select @a=count(1) from '+@FromStr+@TmpStr
exec sp_executesql @sqls,N'@a int output',@CountRows output

if @CountRows <= @PageSize
set @CountPage = 1
else
begin
set @CountPage = @CountRows/@PageSize
if (@CountRows%@PageSize) > 0
set @CountPage = @CountPage + 1
end
return
GO



public static DataTable GetDataTableUseProcedure(int PageSize,int PageCurrent,string FdName,string SelectStr,string FromStr,string WhereStr,string OrderByStr,out int CountRows,out int CountPage)
{
try
{
SqlConnection conn = new SqlConnection(ConnString);
SqlCommand cmd = new SqlCommand("PageShowOne", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@PageSize", SqlDbType.Int, 4));
cmd.Parameters.Add(new SqlParameter("@PageCurrent", SqlDbType.Int, 4));
cmd.Parameters.Add(new SqlParameter("@FdName", SqlDbType.VarChar, 100));
cmd.Parameters.Add(new SqlParameter("@SelectStr", SqlDbType.VarChar, 2000));
cmd.Parameters.Add(new SqlParameter("@FromStr", SqlDbType.VarChar, 1000));
cmd.Parameters.Add(new SqlParameter("@WhereStr", SqlDbType.VarChar, 2000));
cmd.Parameters.Add(new SqlParameter("@OrderByStr", SqlDbType.VarChar, 1000));
cmd.Parameters.Add(new SqlParameter("@CountRows", SqlDbType.Int, 4));
cmd.Parameters.Add(new SqlParameter("@CountPage", SqlDbType.Int, 4));
cmd.Parameters["@PageSize"].Value = PageSize;
cmd.Parameters["@PageCurrent"].Value = PageCurrent;
cmd.Parameters["@FdName"].Value = FdName;
cmd.Parameters["@SelectStr"].Value = SelectStr;
cmd.Parameters["@FromStr"].Value = FromStr;
cmd.Parameters["@WhereStr"].Value = WhereStr;
cmd.Parameters["@OrderByStr"].Value = OrderByStr;
cmd.Parameters["@CountRows"].Direction = ParameterDirection.Output;
cmd.Parameters["@CountPage"].Direction = ParameterDirection.Output;

SqlDataAdapter dp = new SqlDataAdapter();
dp.SelectCommand = cmd;
DataSet ds = new DataSet();
dp.Fill(ds);
CountRows = int.Parse(cmd.Parameters["@CountRows"].Value.ToString().Trim());

CountPage = int.Parse(cmd.Parameters["@CountPage"].Value.ToString().Trim());
return ds.Tables[0];
}
catch (Exception ex)
{
throw (ex);
}
}
草根醉秋意 2009-10-13
  • 打赏
  • 举报
回复
还有
set @StrTotalSQL='select @RecordTotal=count(*) from t1'
应该写成
set @StrTotalSQL=N'select @RecordTotal=count(*) from t1'
草根醉秋意 2009-10-13
  • 打赏
  • 举报
回复

execute(@StrTotalSQL)
--修改为才可以为输出参数赋值(ms sql2005)
EXEC sp_executesql @StrTotalSQL,N'@RecordTotal int out',@RecordTotal out

zsyok 2009-10-13
  • 打赏
  • 举报
回复
我想跳楼。
huming_h 2009-10-13
  • 打赏
  • 举报
回复
这个应该在你执行完 mycmd.ExecuteReader();之后才会有。
chen_ya_ping 2009-10-13
  • 打赏
  • 举报
回复
(1)确保你的存储过程是不是对的,这个可以在查询分析器中进行查看。
(2)要是你的存储过程是对的,那要看你的程序是不是对,你可以调试。
还有就是可以去网上找找人家是怎么调用存储过程的。
LiuK_Moon 2009-10-13
  • 打赏
  • 举报
回复
获取输出参数是在你执行完存储过程后,也就是在mycmd.ExecuteReader();之后
你试试先
zsyok 2009-10-13
  • 打赏
  • 举报
回复

 
Int32 RecordCount = (Int32)mycmd.Parameters["@RecordTotal"].Value;
//说这个未将对像引用,设置为对像的实例。


这句才是。刚发错了。
zsyok 2009-10-13
  • 打赏
  • 举报
回复
我改了也调不用起来。
string Pagecount = mycmd.Parameters["@RecordTotal"].Value.ToString();

说这个未将对像引用,设置为对像的实例。
staywithc 2009-10-13
  • 打赏
  • 举报
回复
恩,楼上的都说对了
huming_h 2009-10-13
  • 打赏
  • 举报
回复
你参数的类型和存储过程类型不匹配。。。
huming_h 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zsyok 的回复:]
C# codepublic SqlDataReader ok(string pagetable,int pageindex,int pagesize)
{

SqlCommand mycmd=new SqlCommand("ok", conopen());
mycmd.CommandType= CommandType.StoredProcedure;
SqlParameter workParm;
workParm= mycmd.Parameters.Add("@pagetable", SqlDbType.NVarChar,50);
mycmd.Parameters["@pagetable"].Value= pagetable;

workParm= mycmd.Parameters.Add("@pageindex", SqlDbType.NVarChar,50);//类型不对,是int
mycmd.Parameters["@pageindex"].Value= pageindex;

workParm= mycmd.Parameters.Add("@pagesize", SqlDbType.NVarChar,50);//类型不对,是int
mycmd.Parameters["@pagesize"].Value= pagesize;

workParm= mycmd.Parameters.Add("@RecordTotal", SqlDbType.Int);
workParm.Direction= ParameterDirection.Output;
Int32 RecordCount= (Int32)mycmd.Parameters["@RecordTotal"].Value;return mycmd.ExecuteReader();

}//调用不起来。真晕。
[/Quote]
zsyok 2009-10-13
  • 打赏
  • 举报
回复

public SqlDataReader ok(string pagetable, int pageindex, int pagesize)
{

SqlCommand mycmd = new SqlCommand("ok", conopen());
mycmd.CommandType = CommandType.StoredProcedure;
SqlParameter workParm;
workParm = mycmd.Parameters.Add("@pagetable", SqlDbType.NVarChar, 50);
mycmd.Parameters["@pagetable"].Value = pagetable;

workParm = mycmd.Parameters.Add("@pageindex", SqlDbType.NVarChar, 50);
mycmd.Parameters["@pageindex"].Value = pageindex;

workParm = mycmd.Parameters.Add("@pagesize", SqlDbType.NVarChar, 50);
mycmd.Parameters["@pagesize"].Value = pagesize;

workParm = mycmd.Parameters.Add("@RecordTotal", SqlDbType.Int);
workParm.Direction = ParameterDirection.Output;
Int32 RecordCount = (Int32)mycmd.Parameters["@RecordTotal"].Value;

return mycmd.ExecuteReader();

}
//调用不起来。真晕。
staywithc 2009-10-13
  • 打赏
  • 举报
回复
看上去应该没错,你直接在查询分析器里执行这个存储过程能得到正确的结果吗?

你具体是怎样调用的?

62,025

社区成员

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

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

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

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