【问题标题】:Get Return Value from Stored procedure in asp.net从 asp.net 中的存储过程中获取返回值
【发布时间】:2026-02-23 05:15:01
【问题描述】:

我有一个存储过程

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

【问题讨论】:

标签: c# asp.net sql-server


【解决方案1】:

您需要在代码中将 Direction 设置为 ParameterDirection.ReturnValue 的参数,但无需在 SP 中添加额外参数。试试这个

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

  int id = (int) returnParameter.Value;

【讨论】:

  • 谢谢,运行良好。 (注意此时 Parameters.Add 已弃用)
  • Parameters.Add(string parameterName, object value) 已弃用,但 Parameters.Add(string parameterName, SqlDbType sqlDbType) 不是。
  • 我正在返回字符串值,但它给出了一个例外Conversion failed when converting the varchar value 'my returned value' to data type int.
  • 请检查您是否将值作为 varchar 从 SP 返回。它必须是 int 值。如果要返回字符串,则应为 SqlParameter returnParameter = cmd.Parameters.Add("RetVal", SqlDbType.String);
  • 一行代码呢:cmd.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
【解决方案2】:

两件事。

  • 在发送返回值之前,查询必须在 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);

                        }

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

【讨论】:

    【解决方案3】:

    你可以试试这个。添加参数作为输出方向,执行查询后得到输出参数值。

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

    【讨论】:

      【解决方案4】:

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

      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#中添加一个参数方向为out的sql参数。 希望这是有道理的。

      【讨论】:

      • 你错了,SQL Server 中的存储过程总是返回一个值,它也总是一个int 值。您可能从未在查询中检索过返回值,但这并不意味着 SP 没有。请看一下RETURN manual
      • 我已在查询中检索到返回值。但我忘了提这个。我还研究过 RETURN 手册,其链接由您提供。感谢您提供链接并修改我的答案。
      【解决方案5】:

      如果您想知道如何将值从存储过程返回到 Visual Basic.NET。请阅读本教程: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
      

      【讨论】:

      • 欢迎来到Stack Overflow。回答问题时,请务必在帖子中披露与任何参考资料或链接的任何从属关系。谢谢!
      【解决方案6】:

      这样做(对代码进行必要的更改)..

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

      【讨论】:

      • 这不是一个好的选择,因为它增加了数据读取器的开销。输出参数是最有效的方法。