从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。请帮我解决这个问题

从asp.net中的存储过程获取返回值

您需要在代码中将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";
            }