使用TableAdapter时,我找不到一种优雅的方法来从存储过程中获取返回值。
使用非标量存储过程调用时,TableAdapter似乎不支持SQL存储过程返回值。您希望自动生成函数的返回值是来自存储过程的返回值,但它不是(它实际上是受影响的行数)。虽然可以使用'out'参数并将变量作为ref传递给自动生成的函数,但它不是一个非常干净的解决方案。
我在网上看到了一些丑陋的黑客来解决这个问题,但没有像样的解决方案。任何帮助将不胜感激。
答案 0 :(得分:1)
获取返回值的方法是在SqlCommand对象上使用SqlParameter,该对象的Direction设置为ParameterDirection.ReturnValue。调用Fill后,应检查TableAdapter的SelectCommand属性。
答案 1 :(得分:1)
注意:方法是使用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列,其中包含存储过程返回值。
答案 2 :(得分:1)
答案 3 :(得分:1)
实际上,您需要做的就是使用SELECT语句而不是RETURN语句从存储过程返回最终值。 SELECT的结果将是返回值。例如,如果您只是将sp退出语句设置为“SELECT 1”,那么您将返回1.现在只需选择要返回的实际标量。
答案 4 :(得分:0)
我无法肯定地说,因为我没有使用TableAdapter,但您可能需要查看存储过程并在程序中包含以下内容。
SET ROWCOUNT OFF
BEGIN
<Procedure Content>
END
SET ROWCOUNT ON
答案 5 :(得分:0)
关闭此问题,因为它似乎不支持返回值,并且没有优雅的解决方法!