Kann eine Erklärung Rückkehr eine using-Anweisung aus Schließen eine Verbindung zu einer Datenbank verhindern?

StackOverflow https://stackoverflow.com/questions/588396

Frage

Wenn ich Temptabellen bin Erstellen Ich erhalte eine Fehlermeldung mir zu sagen, dass die temporäre Tabelle bereits vorhanden ist. Die temporäre Tabelle ist eindeutig für die Sitzung, so dass es meine Verbindung scheint nicht richtig zu schließen und ich denke, es könnte etwas mit einer return-Anweisung Ich habe in meiner using-Anweisung.

zu tun

Ich habe den folgenden Code:

using (IDbConnection connection = dbConnectionHandler.CreateConnection())
{
   connection.Open();
   CreateATempTable();
   PopulateTempTable();
   DataSet ds = CallStoredProcThatUsesTempTable();
   return ds;
}

Ich benutze diese Art von Code an mehreren Stellen eine temporäre Tabelle mit demselben Namen zu erstellen.

Leider erhalte ich folgende Fehlermeldung: There is already an object named '#MyTempTable' in the database

.

Jetzt weiß ich, dass die temporäre Tabelle, um die Sitzung eindeutig ist und so, sobald die Sitzung geschlossen wird verschwinden soll.

Es gibt drei Dinge, die ich glaube, könnte dies dazu führen, ...

  1. Ich muss nennen connection.close ()
  2. Ich brauche die return-Anweisung außerhalb meiner using-Anweisung setzen
  3. Ich brauche die temporäre Tabelle löschen ich vor der Rückkehr erstellt

Wer weiß, welches es ist? oder wenn sie etwas, das ich nicht gedacht?

War es hilfreich?

Lösung

Ich vermute, hier aber überprüfen Sie Ihre Datenbank Connection-Pooling-Einstellungen. Versuchen Sie drehen Pooling und sehen, ob es hilft.

Normalerweise, wenn Sie schließen / entsorgen Verbindung auf der .NET-Bibliotheken Ebene echten Datenbank-Server-Verbindung ist nicht geschlossen. Es ist nur zu Verbindungspool innerhalb Datenprovider zurückgegeben und wiederverwendet werden, wenn das Programm auf eine andere Verbindung mit den gleichen Parametern und Anmeldeinformationen gefragt. Ich glaube nicht, Datenbanksitzung in irgendeiner Weise zurückgesetzt wird, bevor sie an den Pool zurückgegeben werden, mit Ausnahme von offenen Transaktionen und vielleicht einige grundlegende Parameter. Teure Gegenstände, wie temporäre Tabellen werden allein gelassen.

Sie können deaktivieren Pooling (sehr ineffizient). Oder können Sie temporäre Tabelle Existenz überprüfen, bevor Sie versuchen, es zu erstellen und löschen seinen Inhalt, wenn es vorhanden ist. Oder Sie können temporäre Tabelle löschen, bevor Verbindung geschlossen wird.

Andere Tipps

Ich bin ziemlich sicher, dass connection.Dispose () (und damit connection.close () als auch) aufgerufen.

können Sie überprüfen, ob leicht genug, um von 1 zu tun) und 2) und prüfen, ob das Problem weiterhin besteht. Die Lösung ist wahrscheinlich 3) und die Erklärung würde Verbindungspooling sein.

Es sei denn, ein Leistungszyklus auftritt oder eine andere ernst bizarre Ecke Fall dispose aufgerufen werden.

Wenn Sie wollen einen Beweis, das Objekt wickeln und einen Haltepunkt setzen in.

Ein mit Block in eine try / catch übersetzt / endlich unter die Haube blockieren. Ja wird es entsorgen, unabhängig von der Rückkehr innerhalb der using-Blöcke.

Nein, connection.close wird immer da intern aufgerufen werden mit legt es in einem try / finally-Block.

Sie möchten auch können Verbindungspooling berücksichtigen. Versuchen Sie, Ihren Code in einer Transaction gewickelt wird.

Ihre Fragen zu beantworten:

  1. Die Anweisung wird implizit die Verbindung schließen, wenn die Dispose-Methode der Verbindung aufgerufen wird.
  2. Das sollte nicht nötig sein: http://aspadvice.com/blogs/name/archive/2008/05/22/Return-Within-a-C_2300_-Using-Statement.aspx
  3. Versuchen Sie es.

Anweisung wird das Objekt verfügt, wenn seine Klasse IDisposable auch eine return-Anweisung innerhalb der using-Blöcke ist.

Es ist die Verbindungs-Pooling, die Ihre #temptable hält, könnte man diese Tabelle manuell löschen möchten.

Ohne mehr über die Datenbankverbindung Bibliothek im Einsatz zu wissen, würde ich denke, es ist weder die erst beide ist; using wurde speziell eingeführt solche Mittel die Reinigung zu erleichtern, wenn aus Methoden zurückkehrt; es ist direkt analog zu einem gewöhnlichen try...finally Block in Java oder ähnlichem.

Mit anderen Worten, die return den Block und die Dispose Methode verlassen wird auf der Verbindung aufgerufen werden, die, sollte eine vernünftige Umsetzung einer solchen Annahme, die Close Verfahren als Teil dieses Prozesses nennen.

Der entscheidende Punkt ist hier "vernünftige Implementierung".

Sie wird von Connection Pooling verursacht. Wickeln Sie, was Sie in einer Transaktion tun, und rollen sie am Ende zurück. Oder legen Sie die temporäre Tabelle nach dem ds bevölkert.

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