日期:2014-05-18  浏览次数:20426 次

如何获得值存储过程的返回值
存储过程
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,为什么?是存储过程的问题还是程序的问题.

------解决方案--------------------
先ExecuteNonQuery(),再取值。
参数最好一致。@value int output
------解决方案--------------------
http://www.51ini.com/viewthread.php?tid=150&extra=page%3D1
RetrunValue是在存储过程中通过return 关键字返回值的.在.net中必须指定其ParameterDirection.ReturnValue.并且如果你是用ExecuteDataReader()方法来执行存储过程的话,必须先关闭数据库连接对象,才能得到其值.

------解决方案--------------------
定义参数试试
declare @value int
select @value=count(*) from UserInfo where UserLogID=@logid and UserPwd=@pwd 
select @value

看看@value是0还是1
------解决方案--------------------
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);
------解决方案--------------------
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;

------解决方案--------------------
返回值只能是整数int 型,而输出参数可以有int ,varchar等,简单的返回int 时用返回值就可以了,如果你要返回名字之类的肯定要用输出参数的!像你这个需求,2中方法都没必要用的,count(*)在前台用 int result=Convert.ToInt32(cmd.ExecuteScalar());就可以了
------解决方案--------------------
to cansum396 : 这样写是不会被防注入的

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

这样才有可能被注入

ado.net有它自己的安全机制