C # + DbConnection et Disposing DbCommand et erreur attrapant
-
21-09-2019 - |
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
}
}
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
.