Frage

Ich versuche DbConnection und DbCommand, und die richtige Art und Weise zu entsorgen diese Objekte nach dem Gebrauch zu verstehen.

Im Anschluss ist die Code-Snippet ich habe. Durch die Verwendung von „using-Anweisung“ auf DbConnection und DbCommand wäre es ausreichend sein? Ich versuchen, möglichen Speicherverlust zu verhindern.

2. Frage,

Habe ich zu entsorgen DbCommand Objekt?

Dank viel

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
     }
}
War es hilfreich?

Lösung

using verwendet, ist das gleiche wie ein try/finally Block mit dispose() in finally genannt.

DbCommand sollte in einer using Anweisung gewickelt werden, wie es IDisposable implementiert.

Beachten Sie, dass DbCommand tatsächlich eine abstrakte Klasse ist, so dass Sie entweder

benötigen
  • leiten daraus
  • Code an eine Schnittstelle (IDbCommand)
  • Verwendung eines der vordefinierten abgeleiteten Klassen wie SqlCommand.

DbConnection ist auch eine abstrakte Klasse, so dass Sie etwas tun müssen, ähnlich wie ich oben auch für diese für DbCommand vorgeschlagen haben.

Die allgemeine Empfehlung ist, dass, wenn sich ein Objekt implementiert IDisposable, sollte es in einem using Aussage, dass Dispose() auf freie Ressourcen genannt wird, auch wenn eine Ausnahme innerhalb des Anweisungsblockes geworfen wird. In Ihrem Beispiel dann wäre eine gute Praxis, jede der Verbindung, Befehls zu wickeln, DataTable und DbDataAdapter Objekte in einer using Aussage.

Andere Tipps

Ja, ich würde Entsorgen auf dem Objekt DbCommand nennen. Im Allgemeinen sollte die Regel sein, dass, wenn es IDisposable implementiert, sollten Sie seine Dispose-Methode aufrufen, wenn angemessen. Ihr Code sieht gut für mich gebildet. Ich denke, dass Sie auf dem richtigen Weg sind.

Bearbeiten Eigentlich möchten Sie vielleicht auch Ihre DbDataAdapter in einer using-Anweisung wickeln, da es IDisposable auch implementiert.

Verpackung der Objekte in using Blöcken, wie Sie tun sollten ausreichend; dies wird den Coderuf Dispose selbst machen, wenn es eine Ausnahme ausgelöst wird.

Und ja, sollten Sie das tun für die DbCommand Objekt, sowie die DbDataAdapter und der DataTable. Sie alle (direkt oder indirekt) implementieren IDisposable.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top