2017-05-21 2 views
0

Ich habe ein Problem, das immer auf meiner Website passiert. Was immer ich versuchte, konnte ich nicht loswerden.Asp.Net - (Sql) Die Verbindung wurde nicht geschlossen

In meinem asp.net Projekt verwende ich Microstore Azure Server und Datenbank. Ich habe alle meine Fragen immer wieder überprüft. Wo auch immer ich die Verbindung danach öffne, schließe ich es sicher.

auch, bevor ich meine SQL-Verbindung fast alle Funktionen öffnen prüfe ich Verbindungszustand wie:

if (conn.State != System.Data.ConnectionState.Closed) { conn.Close(); } 

Wenn ich meine Haupt-Seite mehrmals aktualisieren ich die Fehlermeldung anzeigt, die meiste Zeit ohne mehrere Refresh Ich habe das Gleiche.

**The connection was not closed. The connection's current state is open.** 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The connection was not closed. The connection's current state is open. 

Kann mir jemand helfen, was kann ich in dieser Situation tun?

+0

Haben Sie noch andere Verbindungen? Öffnen Sie die Verbindung woanders? – pookie

+0

Haben Sie versucht, in einen try-catch und debugging zu schreiben, um sicher zu sein, wo die Ausnahme ausgelöst wird? – pookie

+0

@pookie Ich öffne meine SQL-Verbindung vor jedem Sendebefehl und schließe sie am Ende. – cpzz

Antwort

0

Die Ausnahme weist wahrscheinlich darauf hin, dass die Verbindung bereits geöffnet ist, wenn Sie versuchen, sie zu öffnen. Teilen Sie eine globale Verbindung, die von mehreren Prozessen in verschiedenen Threads verwendet wird? Das würde es verursachen und könnte auch erklären, warum das Problem intermittierend ist.

Die InvalidOperationException wird in der Dokumentation für SqlConnection.Open() erwähnt.

Am besten erstellen Sie explizit jedes Mal eine neue Verbindung und rufen Sie dann Dispose(), wenn Sie fertig sind. Sie können Close() nennen, aber ein einfaches Muster ist using, wie

using(var connection = new SqlConnection("yourConnectionString")) 
{ 
    connection.Open() // open it right before you execute something 
} 

Die using Anweisung sorgt dafür, dass Dispose() wird immer dann aufgerufen. Dispose() Anrufe Close(). Wenn Sie also Verbindungen wie oben erstellen, wird Ihre Verbindung immer geschlossen.

Hinter den Kulissen, wenn Sie Close() oder Dispose(), ist der Rahmen nicht wirklich die Verbindung geschlossen wird. Zumindest nicht sofort. Es hält einen Pool geöffneter Verbindungen und verwendet sie erneut, da es effizienter ist als das Öffnen und Schließen von Verbindungen. Also, wenn Sie eine Verbindung öffnen, schließen Sie sie, öffnen Sie eine andere mit der gleichen Verbindungszeichenfolge, schließen Sie es, und so weiter, die Chancen sind, dass hinter den Kulissen ist es genau die gleiche Verbindung. Aber das Framework behandelt das für Sie hinter den Kulissen. Wenn keine Verbindung verwendet wird, wird die Verbindung wirklich geschlossen. Siehe connection pooling.

So, während es effizient erscheinen könnte zu versuchen, die gleichen SqlConnection wieder zu verwenden, es ist wirklich in Ordnung, nur erstellen und Dispose() nach Bedarf, und lassen Sie das Connection-Pooling die Lebensdauer der Verbindung hinter den Kulissen verwalten.

+0

Vielen Dank für Ihre Antwort. In diesem Fall habe ich noch eine Frage, bevor ich es versuche. Wie wäre es, wenn ich webconfig connectionString jedes Mal benutze, wenn ich es brauche und nach der Verwendung entsorgen? – cpzz

+0

Web.config connectionStrings ist nur ein Platz zum Speichern von Verbindungszeichenfolgen. Es hat daher keinen Einfluss darauf, wie Verbindungen geöffnet oder geschlossen werden. –

0

Sie sollten die Ausnahme beim Schließen der Verbindung überprüfen.

try{ 
    stmt.close(); 
    connection.close(); 
    connection = null; 
}catch(Exception e){ 
    try{ 
     connection.close(); 
     connection = null; 
    }catch(Exception e){ 
    } 
} 
Verwandte Themen