使用返回值调用存储过程

Wes*_*ley 72 c# sql-server ado.net stored-procedures return-value

我试图从我的C#windows应用程序调用存储过程.存储过程在SQL Server 2008的本地实例上运行.我能够调用存储过程但我无法从存储过程中检索该值.该存储过程应该返回序列中的下一个数字.我在网上做过研究,我见过的所有网站都指出这个解决方案有效.

存储过程代码:

ALTER procedure [dbo].[usp_GetNewSeqVal]
      @SeqName nvarchar(255)
as
begin
      declare @NewSeqVal int
      set NOCOUNT ON
      update AllSequences
      set @NewSeqVal = CurrVal = CurrVal+Incr
      where SeqName = @SeqName

      if @@rowcount = 0 begin
print 'Sequence does not exist'
            return
      end

      return @NewSeqVal
end
Run Code Online (Sandbox Code Playgroud)

调用存储过程的代码:

SqlConnection conn = new SqlConnection(getConnectionString());
conn.Open();

SqlCommand cmd = new SqlCommand(parameterStatement.getQuery(), conn);
cmd.CommandType = CommandType.StoredProcedure;

SqlParameter param = new SqlParameter();

param = cmd.Parameters.Add("@SeqName", SqlDbType.NVarChar);
param.Direction = ParameterDirection.Input;
param.Value = "SeqName";

SqlDataReader reader = cmd.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)

我也尝试使用a DataSet来检索具有相同结果的返回值.从存储过程中获取返回值我错过了什么?如果需要更多信息,请告诉我.

Ale*_*Aza 139

您需要将return参数添加到命令:

using (SqlConnection conn = new SqlConnection(getConnectionString()))
using (SqlCommand cmd = conn.CreateCommand())
{
    cmd.CommandText = parameterStatement.getQuery();
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.AddWithValue("SeqName", "SeqNameValue");

    var returnParameter = cmd.Parameters.Add("@ReturnVal", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;

    conn.Open();
    cmd.ExecuteNonQuery();
    var result = returnParameter.Value;
}
Run Code Online (Sandbox Code Playgroud)

  • 无论你命名返回val参数,顺便说一下. (8认同)
  • 不,你不必添加到sp(return语句触发填充标有ReturnValue的参数) (4认同)
  • 您是否还必须将"@ ReturnVal"添加到存储过程中? (3认同)
  • 存储过程的返回值应仅用于指示成功(零)或失败/警告(非零),而不用于返回数据。为此,请使用“输出”参数或结果集。 (3认同)

Gar*_*ary 5

我知道这很旧,但我在谷歌上偶然发现了它。

如果您的存储过程中有返回值,请说“返回 1” - 不使用输出参数。

您可以执行以下操作 - "@RETURN_VALUE" 以静默方式添加到每个命令对象中。无需明确添加

    cmd.ExecuteNonQuery();
    rtn = (int)cmd.Parameters["@RETURN_VALUE"].Value;
Run Code Online (Sandbox Code Playgroud)

  • 我不相信 cmd 实例会有一个在 SqlParameterCollection 中的 RETURN_VALUE 中命名的参数,除非它被明确添加。因此,如果您正在考虑采用 Gary 的上述方法,请确保您已添加 cmd.Parameters.Add(new SqlParameter("@RETURN_VALUE", SqlDbType.Int)); cmd.Parameters["@RETURN_VALUE"].Direction = ParameterDirection.ReturnValue; 但是,我确实相信您不必将 @RETURN_VALUE 添加到存储过程定义中。也许这就是加里的意思。 (5认同)
  • 嗨,加里。你碰巧有引文吗? (2认同)

RaS*_*Sor 5

我的机器上的 EnterpriseLibrary 版本还有其他参数。这是有效的:

        SqlParameter retval = new SqlParameter("@ReturnValue", System.Data.SqlDbType.Int);
        retval.Direction = System.Data.ParameterDirection.ReturnValue;
        cmd.Parameters.Add(retval);
        db.ExecuteNonQuery(cmd);
        object o = cmd.Parameters["@ReturnValue"].Value;
Run Code Online (Sandbox Code Playgroud)