【问题标题】:Return Value from Stored Procedure not set未设置存储过程的返回值
【发布时间】:2010-11-02 08:49:00
【问题描述】:

我有以下非常基本的存储过程:

创建过程 [dbo].[GetNumberToProcess]

作为

返回 999

然后我有一些代码使用企业库运行并获取返回值:

        Dim cmd As DbCommand
        Dim ResultValue as String
        Dim lDBCommand as String = "dbo.GetNumberToProcess"
        Dim actionDB As Sql.SqlDatabase = New Sql.SqlDatabase(lConnectionString)
        cmd = actionDB.GetSqlStringCommand(lDBCommand)

        Dim SQLreturnValue As New SqlParameter("RETURN_VALUE", DbType.Int32)
        SQLreturnValue.Direction = ParameterDirection.ReturnValue

        cmd.Parameters.Add(SQLreturnValue)

        ' Execute the command and put the result into the ResultValue for later processing
        actionDB.ExecuteNonQuery(cmd).ToString()
        ResultValue = cmd.Parameters("RETURN_VALUE").Value.ToString

问题是,当我应该得到“999”时,我得到的结果值是“0”(存储过程被非常缩减,这样我就可以深入了解它为什么不起作用)。

根据我在网上看到的多个示例,这应该可行。

有人对为什么不这样做有任何建议吗?

【问题讨论】:

    标签: sql stored-procedures return-value


    【解决方案1】:

    我的猜测是您的代码没有很好地处理结果。简短回答:尝试将您的存储过程更改为:

    CREATE PROCEDURE [dbo].[GetNumberToProcess]
    
    AS
    
    SET NOCOUNT ON
    RETURN 999
    
    GO
    

    NOCOUNT 设置将防止 SQL 发送“1 条受影响的记录”,这可能会影响您的返回值。

    【讨论】:

    • This has an answer去年接受了,问题是他将sproc作为SQL语句调用,因此后台代码没有获取返回值。
    【解决方案2】:

    如果你要取回一个输出参数而不是一个结果集,你需要在你的存储过程中声明一个输出参数并给它赋值。

    创建过程 [dbo].[GetNumberToProcess] ( @rtInt 作为 int OUT ) 作为

    选择@rtInt = 999


    Dim SQLreturnValue As New SqlParameter("@rtInt", DbType.Int32)

    ResultValue = cmd.Parameters("@rtInt").Value.ToString

    【讨论】:

    • 其实不需要设置输出参数。 ReturnValue 是一种内置输出参数,您可以从存储过程中获得,而无需先声明它。唯一的限制是它只能是一个整数值。
    【解决方案3】:

    你的存储过程显然很好,我不怎么使用 EntLib 我认为你的问题是行

    cmd = actionDB.GetSqlStringCommand(lDBCommand)
    

    尝试改用这个

    cmd = actionDB.GetStoredProcCommand(lDBCommand)
    

    【讨论】:

    • 这行得通,你知道为什么吗?我怀疑 GetSQLStringCommand 没有通过返回值。
    【解决方案4】:

    将您的程序更改为非常简单:

    ALTER PROCEDURE [dbo].[GetNumberToProcess] AS RETURN 999
    

    更改后 ResultValue 是否仍为 0?

    【讨论】:

      【解决方案5】:

      你试过了

      ResultValue = SQLreturnValue.Value.ToString() 
      

      我认为这只是语法问题,不应该产生差异。

      我个人没有返回参数的名称,它工作正常:

      var returnCode = new SqlParameter();
      returnCode.Direction = System.Data.ParameterDirection.ReturnValue;
      returnCode.DbType = System.Data.DbType.Int32;
      

      也许 RETURN_VALUE 这个名字有问题?

      【讨论】:

      • 是的,原来是这样,然后改成现在的样子,以防万一。不幸的是没有。
      猜你喜欢
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-05
      • 2010-11-02
      • 2015-11-06
      • 2021-06-13
      相关资源
      最近更新 更多