如何获得值存储过程的返回值
存储过程
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有它自己的安全机制