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;
}
}
我不认为您显示的代码是问题的原因。虽然处理SqlCommand
(IDbCommand
)对象是一种很好的做法,但在实践中我发现它没有必要。需要的是在使用完SqlDataReader
(IDataReader
)对象后处理它们。正如错误消息所示,在代码中查找未被处理的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。