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

我有一个存储过程

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。请帮助我解决此问题

评论
  • wrerum
    wrerum 回复

    过程从不返回值。您必须在存储过程中使用输出参数。

    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。  希望这有意义。

  • 我爱RMB
    我爱RMB 回复

    以这种方式进行(在代码中进行必要的更改)。

                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";
                }
    

  • 圈圈那叉叉
    圈圈那叉叉 回复

    您可以尝试执行此操作。将参数添加为输出方向,并在执行查询后获取输出参数值。

      SqlParameter parmOUT = new SqlParameter("@return", SqlDbType.Int);
      parmOUT.Direction = ParameterDirection.Output;
      cmd.Parameters.Add(parmOUT);
      cmd.ExecuteNonQuery();
      int returnVALUE = (int)cmd.Parameters["@return"].Value;
    

  • 化嘉悦
    化嘉悦 回复

    If you want to to know how to return a value from stored procedure to Visual Basic.NET. Please read this tutorial: How to return a value from stored procedure

    我使用以下存储过程返回该值。

    CREATE PROCEDURE usp_get_count
    
    AS
    BEGIN
     DECLARE @VALUE int;
    
     SET @VALUE=(SELECT COUNT(*) FROM tblCar);
    
     RETURN @VALUE;
    
    END
    GO
    

  • Gerber
    Gerber 回复

    You need a parameter with Direction set to ParameterDirection.ReturnValue in code but no need to add an extra parameter in SP. Try this

      SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.Int);
      returnParameter.Direction = ParameterDirection.ReturnValue;
      cmd.ExecuteNonQuery();
    
      int id = (int) returnParameter.Value;
    

  • 卟~怕
    卟~怕 回复

    2件事。

    • 发送返回值之前,查询必须在sql服务器上完成。
    • 必须捕获结果,然后在执行之前完成
    • 返回值到达对象。

    用英语完成工作,然后检索值。

    这将不起作用:

                    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);
    
                            }
    

    如果您不确定 检查参数值 读者在处理结果之前和之中。