从asp.net中的存储过程获取返回值
本文关键字:存储过程 获取 返回值 asp net | 更新日期: 2023-09-27 17:58:34
我有一个存储过程
ALTER PROC TESTLOGIN
@UserName varchar(50),
@password varchar(50)
As
Begin
declare @return int;
set @return = (SELECT COUNT(*)
FROM CPUser
WHERE UserName = @UserName
AND Password = @password);
return @return;
End
在c#中
SqlConnection con = db.con;
SqlCommand cmd = new SqlCommand("TESTLOGIN", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter parm = new SqlParameter("@return", SqlDbType.Int);
parm.Direction = ParameterDirection.ReturnValue;
cmd.Parameters.Add(parm);
cmd.Parameters.Add(new SqlParameter("@UserName", txtUserName.Text.ToString().Trim()));
cmd.Parameters.Add(new SqlParameter("@password", txtPassword.Text.ToString().Trim()));
cmd.ExecuteNonQuery();
con.Close();
int id = Convert.ToInt32(parm.Value);
但它总是返回0。请帮我解决这个问题
您需要在代码中将Direction设置为ParameterDirection.ReturnValue
的参数,但不需要在SP中添加额外的参数。请尝试此
SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
returnParameter.Direction = ParameterDirection.ReturnValue;
cmd.ExecuteNonQuery();
int id = (int) returnParameter.Value;
两件事。
-
在发送返回值之前,查询必须在sql server上完成。
-
必须捕获结果,然后在返回值到达对象。
在英语中,完成工作,然后检索值。
这将不起作用:
cmm.ExecuteReader();
int i = (int) cmm.Parameters["@RETURN_VALUE"].Value;
这将起作用:
SqlDataReader reader = cmm.ExecuteReader();
reader.Close();
foreach (SqlParameter prm in cmd.Parameters)
{
Debug.WriteLine("");
Debug.WriteLine("Name " + prm.ParameterName);
Debug.WriteLine("Type " + prm.SqlDbType.ToString());
Debug.WriteLine("Size " + prm.Size.ToString());
Debug.WriteLine("Direction " + prm.Direction.ToString());
Debug.WriteLine("Value " + prm.Value);
}
如果你不确定检查参数的值在读者处理结果之前、期间和之后。
您可以尝试一下。添加参数作为输出方向,执行查询后得到输出参数值。
SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int);
parmOUT.Direction = ParameterDirection.Output;
cmd.Parameters.Add(parmOUT);
cmd.ExecuteNonQuery();
int returnVALUE = (int)cmd.Parameters["@return"].Value;
过程从不返回值。您必须在存储过程中使用输出参数。
ALTER PROC TESTLOGIN
@UserName varchar(50),
@password varchar(50)
@retvalue int output
as
Begin
declare @return int
set @return = (Select COUNT(*)
FROM CPUser
WHERE UserName = @UserName AND Password = @password)
set @retvalue=@return
End
然后,您必须从c添加一个sqlparameter,其参数方向是out。希望这是有意义的。
如果您想知道如何将存储过程中的值返回到Visual Basic。NET。请阅读本教程:如何从存储过程返回值
我使用了以下存储过程来返回该值。
CREATE PROCEDURE usp_get_count
AS
BEGIN
DECLARE @VALUE int;
SET @VALUE=(SELECT COUNT(*) FROM tblCar);
RETURN @VALUE;
END
GO
这样做(对代码进行必要的更改)。。
SqlConnection con = new SqlConnection(GetConnectionString());
con.Open();
SqlCommand cmd = new SqlCommand("CheckUser", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p1 = new SqlParameter("username", username.Text);
SqlParameter p2 = new SqlParameter("password", password.Text);
cmd.Parameters.Add(p1);
cmd.Parameters.Add(p2);
SqlDataReader rd = cmd.ExecuteReader();
if(rd.HasRows)
{
//do the things
}
else
{
lblinfo.Text = "abc";
}