2008-09-17 65 views
5

我无法找到一种优雅的方式来使用TableAdapter从存储过程获取返回值。如何从TableAdapter检索存储过程返回值

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

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

+0

事实上,我有同样的问题,它是可笑的,返回值不支持,没有黑客 – nicodemus13 2008-12-19 15:04:10

回答

0

关闭此问题,因为它出现返回值不支持,并没有优雅的解决方法!

1

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

+0

SelectCommand属性是(AFAIK)私人的TableAdapter。因此,我必须扩展每个TableAdapter的部分类,在我看来,这不是我希望找到的优雅解决方案。 – 2008-09-17 11:18:09

0

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

SET ROWCOUNT OFF 

BEGIN 
<Procedure Content> 
END 

SET ROWCOUNT ON 
+0

感谢您的建议,但不幸的是,设置ROWCOUNT似乎无法解决我的问题。 – 2008-10-02 09:44:48

1

:去使用SqlParameter的方向在哪里= 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); 

存储过程结果加载到数据集,将有尽可能多的数据表作为返回在存储过程中的SELECT语句。

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

1

事实上,所有你需要做的是从使用SELECT语句,没有return语句存储过程返回的最终值。 SELECT的结果将是返回值。例如,如果你只是简单地使你的sp退出语句为“SELECT 1”,那么你将返回1.现在只需选择你想返回的实际标量。