使用C#中的输出参数和结果集读取SP?

Mic*_*ern 1 c# stored-procedures sql-server-2005 sqldatareader output-parameter

我创建了一个类似于这个简化示例的存储过程:

CREATE PROCEDURE dbo.sp_MyStoredProcedure
    @Var1 INT OUTPUT,
    @Var2 DECIMAL(10,2) OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
        @Var1 = COUNT(*),
        @Var2 = SUM(TranAmount)
    FROM
        MyTable

    SELECT * FROM MyTable
END
Run Code Online (Sandbox Code Playgroud)

当我在调用对象的ExecuteReader()方法后尝试从输出变量中读取值时SqlCommand,值为null.

string MyConnString = string.Empty;
SqlConnection MyConn = new SqlConnection(MyConnString);
SqlCommand MyCmd = new SqlCommand("sp_MyStoredProcedure", MyConn);
MyCmd.CommandType = CommandType.StoredProcedure;
MyCmd.Parameters.Add(new SqlParameter("@Var1", SqlDbType.Int));
MyCmd.Parameters.Add(new SqlParameter("@Var2", SqlDbType.Decimal);
MyCmd.Parameters[0].Direction = ParameterDirection.Output;
MyCmd.Parameters[1].Direction = ParameterDirection.Output;
SqlDataReader dr = MyCmd.ExecuteReader(CommandBehavior.CloseConnection);
int Var1 = Convert.ToInt32(MyCmd.Parameters[0].Value);
decimal Var1 = Convert.ToDecimal(MyCmd.Parameters[1].Value);
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Rem*_*anu 10

您需要读取读取器直到结束,输出参数位于TDS流的末尾,并且客户端将不会看到它们,直到结果集未被消耗.

如果在读取结果集之前必须有计数和总和,则必须抛弃OUTPUT参数.只需生成一个普通的结果集,其中包含您感兴趣的两个值,然后购买SELECT*结果集.然后使用SqlDataReader.NextResult()在客户端中读取两个结果集.

更新

这就是我有两个结果集的意思:

CREATE PROCEDURE dbo.sp_MyStoredProcedure    
AS
BEGIN    
  SET NOCOUNT ON;    
  SELECT COUNT(*) as cnt, SUM(TranAmount) as sum_ta
  FROM MyTable
  SELECT * FROM MyTable
END
Run Code Online (Sandbox Code Playgroud)

和客户:

string MyConnString = string.Empty;
SqlConnection MyConn = new SqlConnection(MyConnString);
SqlCommand MyCmd = new SqlCommand("sp_MyStoredProcedure", MyConn);
MyCmd.CommandType = CommandType.StoredProcedure;
using(SqlDataReader dr = MyCmd.ExecuteReader(CommandBehavior.CloseConnection))
{
  while(dr.Read())
  { 
     count = dr["cnt"];
     sum = dr["sum_ta"];
  }
  dr.NextResult();
  while(dr.Read())
  {
    // process MyTable row here
  }
}
Run Code Online (Sandbox Code Playgroud)

注意,你不会需要做到这一点,如果你的C#代码不使用了该数据之前,读者需要的输出参数的值.你可以简单地读取SqlDataReader直到结束,然后检查输出参数,它们将被设置.