9

假设我有这两个对象:

OracleConnection connection = new OracleConnection(connectionString);  
OracleCommand command = new OracleCommand(sql, connection);

要关闭连接或 Oracle,我是否必须调用 command.Dispose()、connection.Dispose() 或两者都调用?

这是否足够好:

using(connection)  
{
    OracleDataReader reader = cmd.ExecuteReader();
    // whatever...
}
4

4 回答 4

17
using (OracleConnection connection = new OracleConnection(connectionString))
{
    using (OracleCommand command = new OracleCommand(sql, connection))
    {
        using (OracleDataReader reader = cmd.ExecuteReader())
        {
        }
    }
}

如果它实现了 IDisposable,并且如果您创建它,则将其放入 using 块中。

于 2009-03-30T18:18:39.333 回答
7

这两个答案都非常有针对性。您总是想在任何 IDisposeable 对象上调用 .Dispose() 。通过包装在“使用”中,编译器总是为您隐含一个 try/finialy 块。

1点注意,如果你想避免嵌套,你可以这样写相同的代码:

 using (OracleConnection connection = new OracleConnection(connectionString))
 using (OracleCommand command = new OracleCommand(sql, connection))
 using (OracleDataReader reader = cmd.ExecuteReader())
    {
        // do something here
    }
于 2009-03-30T19:09:46.340 回答
3

using将确保您的连接已关闭。您还可以在调用之前传递CommandBehavior.CloseConnection给命令的方法以将其关闭。ExecuteReaderDispose

于 2009-03-30T19:08:19.433 回答
3

这已经足够好了。using 语句将包装 dispose 语句,因此即使抛出异常,您也很安全,这是我处置资源的首选方式。

using(OracleConnection connection = new OracleConnection(connectionString);    )  
{
   //Create a command object 
    using(OracleCommand command = new OracleCommand(sql, connection))
    {
      using(OracleDataReader reader = cmd.ExecuteReader())
      {
      }

    }
    // whatever...
}

我认为通过使用“使用”,你是要求编译器注入一个 try ... finally 块,在 finally 块中,它会为你关闭一次性对象。

于 2009-03-30T18:15:32.697 回答