使用语句似乎没有处置我的对象

use*_*898 1 c# ado.net dispose sqlcommand using-statement

我遇到了一些麻烦.我在一个使用块中有一个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.
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试重用我的连接来运行一堆存储过程.这是最奇怪的事情.我在另一个几乎相同的表单上有一些代码,它运行正常,处理命令并允许我创建另一个.我有什么想法我做错了吗?(我正试图让这段代码在帖子中看起来不错,但它似乎超出了我的微薄力量...对于凌乱的代码感到抱歉.)

错误是:已经有一个与此命令关联的打开DataReader,必须先关闭它.

Gus*_*man 6

你所拥有的是一个开放的SqlDataReader(transferReader),关闭和处理datareader或使用using().

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

  • 使用()不能保证对象的破坏,正如你所说的那样保证了Dispose调用,但是你不知道Dispose在内部做了什么,每个例子都假设你有一个带有线程的类,并且在你的Dispose调用中你做了Thread.Abort,对象被释放但线程仍处于活动状态,直到线程在内部完成或者引发ThreadAbortException,这可能在Abort调用后的某个时间发生. (2认同)