使用execute reader从SQL获取返回值

时间:2014-03-06 17:37:11

标签: c# sql sql-server stored-procedures

所以我在SQL服务器中有这个存储过程,其中包含了一些SQL

... part of store procedure...
IF @@ERROR = 0 --AND @@ROWCOUNT = 1
BEGIN
     .. dO STUFF 
     SELECT * FROM MyTable
    RETURN 0
END
ELSE
BEGIN
    RAISERROR('Something went wrong :-(', 16, 1)
    RETURN -1
END

END

在我的C#代码中,我得到了数据,我这样做

//Sql param used to get the return value from the store procedure
SqlParameter returnValueParam = command.Parameters.Add("@return_value", SqlDbType.Int);
returnValueParam.Direction = ParameterDirection.ReturnValue;
using (var reader = command.ExecuteReader(CommandBehavior.CloseConnection))
{
 while (reader.Read())
 {
  SpRetrunValue.EmailAddress = DBNulls.DBNullToString(reader["Email"], string.Empty);
... More stuff
  }
   reader.NextResult();
   SpRetrunValue.ExternalData = new List<ExternalData>();
   var ExtData = new ExternalData();
  while (reader.Read())
  {
   ExtData.Id = DBNulls.DBNullToInteger(reader["ID"], 0);
   SpRetrunValue.ExternalData.Add(intExtData);
   }
   //get the return code on the SP 0 for success -1 for error
   SpRetrunValue.ResultCode = (int)returnValueParam.Value;
   }

我遇到的问题是,如果我将它与command.ExecuteNonQuery();一起使用,那么我可以获得返回值。但是现在使用我无法获得返回值,但我确实得到了结果集。难道不可能以这种方式获得返回值吗?我已经看过这篇文章here on stackoverflow,但是这需要我在存储过程中添加另一个参数,我觉得这样就无法像上面的存储过程那样返回一个值。

1 个答案:

答案 0 :(得分:5)

在尝试捕获Return值或OUTPUT参数之前,您必须完成所有行集的处理。在SpRetrunValue.ResultCode = (int)returnValueParam.Value;声明之后放置using

Understanding SQL Server Return Codes and Output Parameters

此外,this post