Question

Je suis en train de comprendre DbConnection et DbCommand, et la façon de disposer les objets après utilisation.

Ce qui suit est l'extrait de code que j'ai. En utilisant « using » sur DbConnection et DbCommand, serait-il suffisant? Je suis en train de prévenir la fuite de mémoire possible.

2ème question,

Dois-je Éliminez objet DbCommand?

Merci beaucoup

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
     }
}
Était-ce utile?

La solution

en utilisant using est identique à un bloc de try/finally avec dispose() appelé finally.

DbCommand doit être enveloppé dans une déclaration de using qu'elle met en œuvre IDisposable.

Notez que DbCommand est en fait une classe abstraite de sorte que vous devrez soit

  • en tirer
  • code pour une interface (IDbCommand)
  • utiliser l'une des classes dérivées prédéfinis tels que SqlCommand.

DbConnection est également une classe abstraite de sorte que vous aurez besoin de faire quelque chose de similaire comme je l'ai suggéré ci-dessus pour DbCommand pour cela aussi.

La recommandation générale est que si un objet implémente IDisposable, il doit être enveloppé dans un using déclaration telle que Dispose() est appelé à libérer des ressources, même si une exception est levée à l'intérieur du bloc de déclaration. Dans votre exemple, alors, une bonne pratique serait d'envelopper chacun des objets connexion, commande, DataTable et DbDataAdapter dans un communiqué de using.

Autres conseils

Oui j'appeler Dispose sur l'objet DbCommand. En général, la règle devrait être que si elle implémente IDisposable, vous devez appeler la méthode Dispose le cas échéant. Votre code semble bien formé pour moi. Je pense que vous êtes sur la bonne voie.

EDIT En fait, vous pouvez également envelopper votre DbDataAdapter dans une déclaration à l'aide, car il met en œuvre trop IDisposable.

Enveloppement des objets dans des blocs de using comme vous le faites devrait être suffisant; ce qui fera l'appel de code Dispose, même s'il y a une exception levée.

Et oui, vous devez le faire pour l'objet DbCommand, ainsi que la DbDataAdapter et la DataTable. Tous (directement ou indirectement) à mettre en œuvre IDisposable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top