9

次の 2 つのオブジェクトがあるとします。

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 ステートメントは dispose ステートメントをラップするため、例外がスローされた場合でも安全です。これは、リソースを破棄するための私の推奨方法です。

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

    }
    // whatever...
}

「using」を使用すると、コンパイラに try ... finally ブロックを挿入するように求められ、finally ブロックで使い捨てオブジェクトが閉じられると思います。

于 2009-03-30T18:15:32.697 に答える
3

using接続が閉じていることを確認します。CommandBehavior.CloseConnectionコマンドのメソッドに渡して、呼び出されるExecuteReader前に閉じることもできます。Dispose

于 2009-03-30T19:08:19.433 に答える