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;