如何获得值存储过程的返回值

xyj200588 2008-01-31 09:53:28
存储过程
ALTER procedure CheckUser
(
@logid varchar(50),
@pwd varchar(50),
@value varchar(50) output
)
as
select * from UserInfo where UserLogID=@logid and UserPwd=@pwd
set @value= @@rowcount
return @value

我在程序中是
SqlCommand cmd = new SqlCommand("CheckUser", cn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@logid", logid));
cmd.Parameters.Add(new SqlParameter("@pwd", pwd));
SqlParameter returnvalue = new SqlParameter("@value", SqlDbType.Int, 4);
returnvalue.Direction = ParameterDirection.Output;
cmd.Parameters.Add(returnvalue);
count = Convert.ToInt32(cmd.Parameters["@value"].Value);
cmd.ExecuteNonQuery();
但是我获得传出值始终为0,为什么?是存储过程的问题还是程序的问题.
...全文
117 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xyj200588 2008-01-31
  • 打赏
  • 举报
回复
大家继续,明天加完分之后在结贴。
goody9807 2008-01-31
  • 打赏
  • 举报
回复
to cansum396 : 这样写是不会被防注入的

string sql="select * from user where userid" + UserID ...

这样才有可能被注入

ado.net有它自己的安全机制
paulyjin 2008-01-31
  • 打赏
  • 举报
回复
返回值只能是整数int 型,而输出参数可以有int ,varchar等,简单的返回int 时用返回值就可以了,如果你要返回名字之类的肯定要用输出参数的!像你这个需求,2中方法都没必要用的,count(*)在前台用 int result=Convert.ToInt32(cmd.ExecuteScalar());就可以了
lucky749 2008-01-31
  • 打赏
  • 举报
回复
ALTER procedure CheckUser
(
@logid varchar(50),
@pwd varchar(50),
@value int output
)
as
select @value=count(*) from UserInfo where UserLogID=@logid UserPwd=@pwd


cmd.ExecuteNonQuery();
count =cmd.Parameters["@value"].Value;
xyj200588 2008-01-31
  • 打赏
  • 举报
回复
1\int count=dr.cmd.executeReader();这样子执行,然后判断count

2\set @value= @@rowcount
return @value 如果用输出参数一般不用return了(我觉得返回值跟输出参数你没搞明白)
有什么区别?那个会更使用一些呢?
xyj200588 2008-01-31
  • 打赏
  • 举报
回复
嗯,我以前是直接按下面的方法写的
ALTER procedure CheckUser
(
@logid varchar(50),
@pwd varchar(50),
@value varchar(50) output
)
as
select * from UserInfo where UserLogID=@logid and UserPwd=@pwd

在程序中直接用int count=dr.cmd.executeReader();这样子执行,然后判断count的值
paulyjin 2008-01-31
  • 打赏
  • 举报
回复
ALTER procedure CheckUser
(
@logid varchar(50),
@pwd varchar(50),
@value varchar(50) output
)
as
select * from UserInfo where UserLogID=@logid and UserPwd=@pwd
set @value= @@rowcount
return @value 如果用输出参数一般不用return了(我觉得返回值跟输出参数你没搞明白)


cmd.ExecuteNonQuery();// 这里应该先执行
count = Convert.ToInt32(cmd.Parameters["@value"].Value);
//只用连接关闭后才能取值的
count = Convert.ToInt32(cmd.Parameters["@value"].Value);
yzaiml 2008-01-31
  • 打赏
  • 举报
回复
定义参数试试
declare @value int
select @value=count(*) from UserInfo where UserLogID=@logid and UserPwd=@pwd
select @value

看看@value是0还是1
xyj200588 2008-01-31
  • 打赏
  • 举报
回复
应该如何写才会更安全呢?
cansum396 2008-01-31
  • 打赏
  • 举报
回复
另外,你这么写sql语句容易被SQL注入式攻击
goody9807 2008-01-31
  • 打赏
  • 举报
回复
http://www.51ini.com/viewthread.php?tid=150&extra=page%3D1
RetrunValue是在存储过程中通过return 关键字返回值的.在.net中必须指定其ParameterDirection.ReturnValue.并且如果你是用ExecuteDataReader()方法来执行存储过程的话,必须先关闭数据库连接对象,才能得到其值.
yzaiml 2008-01-31
  • 打赏
  • 举报
回复
返回0就是没有啊
cansum396 2008-01-31
  • 打赏
  • 举报
回复
returnvalue.Direction = ParameterDirection.InputOutput;
xiaoqhuang 2008-01-31
  • 打赏
  • 举报
回复
先ExecuteNonQuery(),再取值。
参数最好一致。@value int output

62,073

社区成员

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

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

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

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