我遇到了一些麻烦。我在一个使用块中有一个SqlCommand。通常这很好。但是,这次代码退出使用块,但命令没有被释放。我很难过。
using (SqlCommand transferCommand = new SqlCommand(strHeaderStoredProcedure, connection))
{
transferCommand.CommandType = System.Data.CommandType.StoredProcedure;
transferCommand.Parameters.Add("@InvtTransferID", SqlDbType.UniqueIdentifier).Value = InvtTransferID;
SqlDataReader transferReader = transferCommand.ExecuteReader();
while (transferReader.Read())
{
//do my stuff, this all works fine
}
}
using (SqlCommand transferCommand = new SqlCommand(strDetailsStoredProcedure, connection))
{
transferCommand.CommandType = System.Data.CommandType.StoredProcedure;
transferCommand.Parameters.Add("@InvtTransferID", SqlDbType.UniqueIdentifier).Value = InvtTransferID;
SqlDataReader transferReader = transferCommand.ExecuteReader(); <-- Error happens here.
}
我正在尝试重用我的连接来运行一堆存储过程。这是最奇怪的事情。我在另一个几乎相同的表单上有一些代码,它运行正常,处理命令并允许我创建另一个。我有什么想法我做错了吗? (我试图让这段代码在帖子中看起来不错,但它似乎超出了我的微薄力量...对于凌乱的代码感到遗憾。)
错误是:已经有一个与此命令关联的打开DataReader,必须先关闭它。
答案 0 :(得分:6)
你所拥有的是一个开放的SqlDataReader(transferReader),关闭并处理datareader或使用using()。
我认为该命令没有被释放,因为阅读器仍处于打开状态。
答案 1 :(得分:1)
作为一些额外的信息,下面是编写using语句时编译器在幕后所做的事情。
using(IDisposable x)
{
//some work here
}
变成
IDisposable x = //some IDisposable
try
{
//do work here
}
finally
{
x.Dispose()
}
正如Gusman所说,使用不能保证对象的破坏,它只是调用对象的dispose方法。这是IDisposable清理任何已用资源的可重复性
我希望这会有所帮助