【问题标题】:How to retrieve stored procedure return values from a TableAdapter如何从 TableAdapter 中检索存储过程的返回值
【发布时间】:2010-09-10 00:42:24
【问题描述】:

在使用 TableAdapters 时,我找不到从存储过程中获取返回值的优雅方法。

使用非标量存储过程调用时,TableAdapter 似乎不支持 SQL 存储过程返回值。您希望自动生成函数的返回值是存储过程的返回值,但事实并非如此(它实际上是受影响的行数)。尽管可以使用 'out' 参数并将变量作为 ref 传递给自动生成的函数,但这不是一个非常干净的解决方案。

我在网上看到了一些丑陋的黑客来解决这个问题,但没有像样的解决方案。任何帮助将不胜感激。

【问题讨论】:

  • 确实,我也有同样的问题,不支持返回值很可笑,没有hack

标签: asp.net sql-server


【解决方案1】:
【解决方案2】:

获取返回值的方法是在 SqlCommand 对象上使用 SqlParameter,该对象的 Direction 设置为 ParameterDirection.ReturnValue。您应该在调用 Fill 后检查 TableAdapter 的 SelectCommand 属性。

【讨论】:

  • SelectCommand 属性是(AFAIK)TableAdapter 私有的。因此,我必须使用部分类扩展每个 TableAdapter,在我看来,这不是我希望找到的优雅解决方案。
【解决方案3】:

注意:要走的路是使用 SqlParameter,其中 Direction = ParameterDirection.ReturnValue

话虽如此,正如有人已经提到过SqlParameters,这里是一个使用DataSet 的动态方法替代。 (如果你是这样骑的):

示例 SQL 语句和 C# 作为休闲方式:

string sql = @"DECLARE @ret int 
            EXEC @ret = SP_DoStuff 'parm1', 'parm2'
            SELECT @ret as ret";

DataSet ds = GetDatasetFromSQL(sql); //your sql to dataset code here...

int resultCode = -1;
int.TryParse(ds.Tables[ds.Tables.Count-1].Rows[0][0].ToString(), out resultCode); 

存储过程结果被加载到 DataSet 中,并且将具有与存储过程中的 return select 语句一样多的 DataTable。

DataSet 中的最后一个 DataTable 将有 1 行 1 列包含存储过程的返回值。

【讨论】:

    【解决方案4】:

    我不能肯定地说,因为我没有使用 TableAdapters,但您可能需要查看您的存储过程并在您的过程周围包含以下内容。

    SET ROWCOUNT OFF
    
    BEGIN
    <Procedure Content>
    END
    
    SET ROWCOUNT ON
    

    【讨论】:

    • 感谢您的建议,但不幸的是,设置 ROWCOUNT 似乎无法解决我的问题。
    【解决方案5】:

    关闭这个问题,因为它似乎不支持返回值并且没有优雅的解决方法!

    【讨论】:

      【解决方案6】:

      实际上,您需要做的就是使用 SELECT 语句而不是 RETURN 语句从存储过程中返回最终值。 SELECT 的结果将是返回值。例如,如果您只是将 sp 退出语句设置为“SELECT 1”,那么您将返回一个 1。现在只需选择您想要返回的实际标量。

      【讨论】:

        猜你喜欢
        • 2012-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 2011-12-20
        • 2012-08-03
        相关资源
        最近更新 更多