C# 使用执行读取器从SQL获取返回值

C# 使用执行读取器从SQL获取返回值,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,所以我在SQLServer中有一个存储过程,其中包含了一些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

所以我在SQLServer中有一个存储过程,其中包含了一些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;
   }
//用于从存储过程获取返回值的Sql参数
SqlParameter returnValueParam=command.Parameters.Add(“@return\u value”,SqlDbType.Int);
returnValueParam.Direction=参数Direction.ReturnValue;
使用(var reader=command.ExecuteReader(CommandBehavior.CloseConnection))
{
while(reader.Read())
{
SpRetrunValue.EmailAddress=DBNulls.DBNullToString(读卡器[“Email”],string.Empty);
…更多的东西
}
reader.NextResult();
SpRetrunValue.ExternalData=新列表();
var ExtData=新的ExternalData();
while(reader.Read())
{
ExtData.Id=DBNulls.DBNullToInteger(读卡器[“Id”],0);
SpRetrunValue.ExternalData.Add(intExtData);
}
//获取SP 0上的返回代码表示成功,获取1表示错误
SpRetrunValue.ResultCode=(int)returnValueParam.Value;
}

我遇到的问题是,如果我将它与
command.ExecuteNonQuery()一起使用然后我可以得到返回值。但是现在使用as-is我不能得到返回值,但是我得到了结果集。这样不可能得到返回值吗?我看过这篇文章,但这要求我向存储过程中添加另一个参数,我觉得这样做违背了只返回上面存储过程中的值的目的。

在尝试捕获返回值或输出参数之前,您必须完成对所有行集的处理。Place
SpRetrunValue.ResultCode=(int)returnValueParam.Value
语句在
之后编写代码


另外,

这是一篇好文章。每个例子都不一样,所以请看一下细节。最好理解reader.Close()如何影响返回代码,使其在读取值之前实际存在。