Как закрыть OracleConnection в .NET - PullRequest
9 голосов
/ 30 марта 2009

Скажите, у меня есть два объекта:

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

Чтобы закрыть соединение или Oracle, нужно ли вызывать command.Dispose (), connection.Dispose () или оба?

Достаточно ли это хорошо:

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

Ответы [ 4 ]

17 голосов
/ 30 марта 2009
using (OracleConnection connection = new OracleConnection(connectionString))
{
    using (OracleCommand command = new OracleCommand(sql, connection))
    {
        using (OracleDataReader reader = cmd.ExecuteReader())
        {
        }
    }
}

Если он реализует IDisposable, и если вы его создаете, поместите его в блок using.

7 голосов
/ 30 марта 2009

Оба ответа в значительной степени нацелены. Вы всегда хотите вызывать .Dispose () для любого объекта IDisposeable. Оборачивая «используя», вы увеличиваете компилятор, чтобы всегда реализовывать блок try / finialy.

1 примечание: если вы хотите избежать вложения, вы можете написать такой же код, например:

 using (OracleConnection connection = new OracleConnection(connectionString))
 using (OracleCommand command = new OracleCommand(sql, connection))
 using (OracleDataReader reader = cmd.ExecuteReader())
    {
        // do something here
    }
3 голосов
/ 30 марта 2009

using обеспечит закрытие вашего соединения. Вы также можете передать CommandBehavior.CloseConnection методу ExecuteReader вашей команды, чтобы закрыть его до вызова Dispose.

3 голосов
/ 30 марта 2009

Это достаточно хорошо. оператор 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 он закроет для вас одноразовый объект.

...