C # + Утилизация DbConnection и DbCommand и отлов ошибок - PullRequest
3 голосов
/ 19 марта 2010

Я пытаюсь понять DbConnection и DbCommand, и как правильно расположить эти объекты после использования.

Ниже приведен фрагмент кода, который у меня есть. Будет ли этого достаточно при использовании «оператора using» в DbConnection и DbCommand? Я пытаюсь предотвратить возможную утечку памяти.

2-й вопрос,

Нужно ли удалять объект DbCommand?

Большое спасибо

DbProviderFactory fac = DbProviderFactories.GetFactory(this.DatabaseProviderName);

using (DbConnection dbConn = fac.CreateConnection())
{
     dbConn.ConnectionString = this.ConnectionString;

     using (DbCommand comm = fac.CreateCommand())
     {
          comm.CommandText = "select * from aTable";
          comm.Connection = dbConn;
          DataTable targetTable = new DataTable();

          DbDataAdapter facDA = fac.CreateDataAdapter();
          facDA.SelectCommand = comm;
          facDA.Fill(targetTable);

          //assuming Adapter would open / close connection (right assumption?)

          //do something with the datatable
     }
}

Ответы [ 3 ]

6 голосов
/ 19 марта 2010

с использованием using совпадает с try/finally блоком с dispose(), вызываемым в finally.

DbCommand следует заключить в оператор using, так как он реализует IDisposable.

Обратите внимание, что DbCommand на самом деле является абстрактным классом, поэтому вам потребуется либо

  • происходит от него
  • код для интерфейса (IDbCommand)
  • использовать один из предопределенных производных классов, например SqlCommand.

DbConnection также является абстрактным классом, поэтому вам нужно будет сделать нечто подобное, как я предлагал выше для DbCommand, для этого тоже.

Общая рекомендация состоит в том, что если объект реализует IDisposable, он должен быть заключен в оператор using так, чтобы Dispose() вызывался для свободных ресурсов, даже если исключение выдается внутри в блоке операторов. Тогда в вашем примере хорошей практикой было бы заключить в оболочку каждый из объектов подключения, команды, DataTable и DbDataAdapter в операторе using.

1 голос
/ 19 марта 2010

Завершение объектов в блоки using, как вы, должно быть достаточно;это вызовет код Dispose, даже если возникнет исключение.

И да, вы должны сделать это для объекта DbCommand, а также для DbDataAdapter и DataTable.Все они (прямо или косвенно) реализуют IDisposable.

1 голос
/ 19 марта 2010

Да, я бы назвал Dispose для объекта DbCommand. В общем, правило должно быть таково: если он реализует IDisposable, вы должны вызывать его метод Dispose, когда это необходимо. Ваш код выглядит хорошо сформированным для меня. Я думаю, что вы на правильном пути.

РЕДАКТИРОВАТЬ На самом деле, вы можете также обернуть ваш DbDataAdapter в оператор использования, поскольку он также реализует IDisposable.

...