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

时间:2014-05-29 22:53:01

标签: 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.
}

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

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

2 个答案:

答案 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清理任何已用资源的可重复性

我希望这会有所帮助

相关问题