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

本文关键字:关联 命令 错误 Server SQL 有一个 DataReader | 更新日期: 2023-09-27 18:29:44

所以,我根据标题行得到了错误。看起来很不言自明,但我的理解是"正在使用"块中的对象被处理掉了?这个错误是在另一个小错误中断了代码执行之后出现的,所以也许我被一个打开的阅读器卡住了,我需要关闭或关闭它?如果有任何帮助,我们将不胜感激?

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;
    }
}

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

我不认为您显示的代码是问题的原因。虽然处理SqlCommandIDbCommand)对象是一种很好的做法,但在实践中我发现它没有必要。需要的是在使用完SqlDataReaderIDataReader)对象后处理它们。正如错误消息所示,在代码中查找未被处理的SqlDataReader对象的用法。异常可能是从您显示的代码中抛出的,但我怀疑原因是与程序执行中早期使用的相同SqlConnection关联的SqlDataReader尚未处理。

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

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

这两种技术都有一些缺点,但都能在上运行

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

添加

MultipleActiveResultSets=true;

MARS Connection=True;

到您的连接字符串(http://www.connectionstrings.com/sql-server-2008)这将允许多个句柄,但如果前一个操作在异常中被"中断",请尽量避免使用"using"或在其中使用try/catch。

相关文章: