关于c#:使用语句似乎没有处理我的对象

Using statement doesn't seem to dispose my object

我遇到了麻烦。我在using块中有一个SqlCommand。通常这可以正常工作。但是,这一次,代码退出了using块,但是命令没有被释放。它让我感到难过。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()。

我假定由于阅读器仍处于打开状态而未释放命令。


作为一点额外的信息,这是编译器在编写using语句时在后台执行的操作。

1
2
3
4
using(IDisposable x)
{
  //some work here
}

变成

1
2
3
4
5
6
7
8
9
10
IDisposable x = //some IDisposable

try
{
    //do work  here
}
finally
{
  x.Dispose()
}

就像Gusman提到的那样,using不能保证对象的销毁,它只是调用对象的dispose方法。清理所有使用过的资源是IDisposable的责任

我希望这会有所帮助