C#/SQL Server错误';已经有一个与此命令关联的打开的DataReader,必须先关闭它;

C#/SQL Server错误';已经有一个与此命令关联的打开的DataReader,必须先关闭它;,c#,database-connection,sql-server-2008-r2,C#,Database Connection,Sql Server 2008 R2,因此,我根据标题行得到了错误。这似乎是不言自明的,但我的理解是“使用”块中的对象被处理掉了?这个错误是在另一个小错误中断了代码执行之后出现的,所以我可能被一个需要关闭或关闭的开放阅读器卡住了?如果有任何帮助,我们将不胜感激 public override long GetStatsBenchmark(String TableName) { using (SqlCommand cmd = new SqlCommand("sprocReturnDataPointBenchmark", thi

因此,我根据标题行得到了错误。这似乎是不言自明的,但我的理解是“使用”块中的对象被处理掉了?这个错误是在另一个小错误中断了代码执行之后出现的,所以我可能被一个需要关闭或关闭的开放阅读器卡住了?如果有任何帮助,我们将不胜感激

public override long GetStatsBenchmark(String TableName)
{
    using (SqlCommand cmd = new SqlCommand("sprocReturnDataPointBenchmark", this.sqlConnection))
    {
        cmd.CommandType = System.Data.CommandType.StoredProcedure;
        SqlParameter outputParameter = new SqlParameter
        {
            ParameterName = "@benchmark",
            Direction = System.Data.ParameterDirection.Output,
            SqlDbType = System.Data.SqlDbType.BigInt,
        };
        cmd.Parameters.Add(outputParameter);
        SqlParameter inputParameter = new SqlParameter
        {
            ParameterName = "@tblName",
            Direction = System.Data.ParameterDirection.Input,
            SqlDbType = System.Data.SqlDbType.NVarChar,
            Value = TableName
        };
        cmd.Parameters.Add(inputParameter);
        cmd.ExecuteNonQuery();

        return (long)outputParameter.Value;
    }
}

我不认为您显示的代码是问题的原因。虽然处置
SqlCommand
IDbCommand
)对象是一种很好的做法,但在实践中,我发现这并不是必需的。需要做的是在使用完
SqlDataReader
IDataReader
)对象后,将其处理掉。如错误消息所示,在代码中查找未被处置的
SqlDataReader
对象的用法。您正在显示的代码可能会引发异常,但我怀疑原因是与程序执行中先前使用的、尚未处理的
SqlConnection
相关联的
SqlDataReader

using子句的一个问题是,它没有提供一种方法来处理编译器隐式try/finally块中的异常为你而生

你可以 1) 用try/catch包装using子句,或 2) 手动编写try/catch/finally代码,而不是使用,在finally块中调用Dispose并在catch块中添加异常处理

这两种技术都有一些小缺点,但都可以

您可以将MARS(多个活动结果集)添加到连接字符串中,以允许同时打开多个记录集(或类似记录集)


连接到您的连接字符串(http://www.connectionstrings.com/sql-server-2008)这将允许多个句柄,但如果在异常中上一个操作被“中断”,请尝试避免使用“使用”或者在它内部使用try/catch。

它是可复制的,还是在调试时只发生过一次?@Bryan我一直在错误时停止它,重新运行,同样的错误。我在调试cmd.Dispose时尝试过,但没有效果..您是否在其他地方使用
this.sqlConnection
执行任何可能会影响此操作的操作?听起来代码中其他地方的另一个命令对象可能正在使用相同的
SqlConnection
,但它尚未关闭。@bryancrossby我确实在其他代码中使用了SqlConnection,但与我的示例一样都在相同的“使用”范围内。我认为这会释放连接,是不是错了?对不起,我的意思是,在另一个方法中是否有另一个
SqlCommand
正在使用
this.sqlConnection
,它可能不在using块中,或者没有调用
Close()/Dispose()
?没错。谢谢我在40+中找到了一个我认为没有被调用的公开引用。
MultipleActiveResultSets=true;
MARS Connection=True;