C# 使用语句似乎无法处理我的对象

C# 使用语句似乎无法处理我的对象,c#,ado.net,dispose,sqlcommand,using-statement,C#,Ado.net,Dispose,Sqlcommand,Using Statement,我有点麻烦。我在using块中有一个SqlCommand。通常这很好用。但是,这一次,代码退出using块,但命令不会被释放。这把我难住了 using (SqlCommand transferCommand = new SqlCommand(strHeaderStoredProcedure, connection)) { transferCommand.CommandType = System.Data.CommandType.StoredProcedure; transferC

我有点麻烦。我在using块中有一个SqlCommand。通常这很好用。但是,这一次,代码退出using块,但命令不会被释放。这把我难住了

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,必须先关闭它。

您拥有的是一个打开的SqlDataReader transferReader,请关闭并处置DataReader,或使用using


我假设命令没有被释放,因为读卡器仍然处于打开状态。

您拥有的是一个打开的SqlDataReader transferReader,请关闭并处理datareader或使用using


我假设命令没有被释放,因为读卡器仍然处于打开状态。

作为一点额外的信息,下面是编译器在幕后编写using语句时所做的操作

using(IDisposable x)
{
  //some work here
}
变成

IDisposable x = //some IDisposable

try
{
    //do work  here
}
finally
{
  x.Dispose()
}
正如Gusman提到的,使用并不能保证对象的破坏,它只调用对象的dispose方法。清理任何已使用的资源是IDisposable的责任


我希望这能有所帮助,作为一点额外的信息,下面是编译器在编写using语句时在幕后所做的工作

using(IDisposable x)
{
  //some work here
}
变成

IDisposable x = //some IDisposable

try
{
    //do work  here
}
finally
{
  x.Dispose()
}
正如Gusman提到的,使用并不能保证对象的破坏,它只调用对象的dispose方法。清理任何已使用的资源是IDisposable的责任


我希望这有帮助

您能提供您收到的实际异常或错误消息吗?错误文本是:已经有一个与此命令关联的打开的DataReader,必须先关闭它。但是,在释放该命令时,datareader通常是关闭的。您能提供您收到的实际异常或错误消息吗?错误文本是:已经有一个打开的datareader与该命令关联,必须先关闭它。然而,当命令被释放时,datareader通常是关闭的。将SqlDataReader放在using语句中解决了我的问题。但这很奇怪,我认为using总是会处理using语句中的对象以及在其范围内创建的任何对象,而不管其他条件如何。我猜这是一个错误的假设?使用不能保证对象销毁,正如您所说的,可以保证Dispose调用,但您不知道Dispose在内部做什么,例如,假设您有一个带有线程的类,并且在Dispose调用中执行线程。中止,对象已被释放,但线程仍处于活动状态,直到线程在内部完成或引发ThreadAbortException,这可能发生在Abort调用后的某个时间。TIL using语句不是一个神奇的项目符号。谢谢你花时间给我解释。嗯,你说得对。将SqlDataReader放在using语句中解决了我的问题。但这很奇怪,我认为using总是会处理using语句中的对象以及在其范围内创建的任何对象,而不管其他条件如何。我猜这是一个错误的假设?使用不能保证对象销毁,正如您所说的,可以保证Dispose调用,但您不知道Dispose在内部做什么,例如,假设您有一个带有线程的类,并且在Dispose调用中执行线程。中止,对象已被释放,但线程仍处于活动状态,直到线程在内部完成或引发ThreadAbortException,这可能发生在Abort调用后的某个时间。TIL using语句不是一个神奇的项目符号。谢谢你花时间给我解释。是的,这很有道理。但这很奇怪。我可能已经多次使用这个结构,这是我第一次遇到问题。所以我并不怀疑SqlDataReader,因为它以前一直工作得很好。我猜它只是因为某些东西起作用而展示出来,并不意味着它是对的。是的,现在这很有道理。但这很奇怪。我可能已经多次使用这个结构,这是我第一次遇到问题。所以我并不怀疑SqlDataReader,因为它以前一直工作得很好。我猜它只是因为某些东西起作用而出现并不意味着它是对的。