So schließen Sie alle vorhandenen Verbindungen zu einer Datenbank programmgesteuert

7

Ich möchte die bestehenden Verbindungen zu einem SQL Server schließen, damit ich eine Wiederherstellung für diese Datenbank durchführen kann. Ich benutze das Entity-Framework. Ich habe versucht,

auszuführen %Vor%

aber dann bekomme ich eine Ausnahme, die das sagt

  

Verbindung wurde nicht geschlossen

Ich kann nicht herausfinden, warum die Verbindungen nicht geschlossen werden dürfen?

Dieses Bild zeigt die vollständige Ausnahme

das ist die Methode,

%Vor%

Bearbeiten: Ich entfernte die erste .Open (). Jetzt habe ich nur Open ()

    
Sanke 07.05.2015, 05:20
quelle

8 Antworten

7

Sie erhalten diesen Fehler, wenn Sie bei einer Verbindung zweimal% code% aufrufen. Sie sollten alle SqlConnection-Objekte erstellen, die Sie in Open() blocks erstellen, und sie nur einmal öffnen.

Wenn Sie Verbindungen wiederverwenden, "um es schneller zu machen", macht .NET das standardmäßig für Sie über Verbindungspooling , aber Sie müssen das Verbindungsobjekt entsorgen, damit es funktioniert.

    
Scott Chamberlain 07.05.2015, 05:27
quelle
8

Es scheint, dass Entity Framework eine Verbindung zur Datenbank hält. Sie können sehen, dass sp_who2 in SQL Server Management Studio ausgeführt wird, wobei Entity Framework unter ProgramName als EntityFrameworkMUE aufgeführt ist.

Sie müssen zwar keine "rohen" SQL-Anweisungen verwenden, um die aktiven Verbindungen zu trennen, aber es kann auch so gelöst werden:

%Vor%     
Default 07.05.2015 08:33
quelle
3

Sie müssen den Reader, den Befehl und die Verbindung entsorgen. Dein Leser ist nicht entsorgt. Dieses Code-Snippet garantiert, dass die Verbindung geschlossen wird, auch wenn während des Lesevorgangs Ausnahmen ausgelöst werden.

%Vor%     
Radin Gospodinov 07.05.2015 09:29
quelle
2

Der Fehler ist ziemlich klar ... Mit Linq können Sie die Verbindung, auf der Sie gerade sind, nicht schließen. Ich habe das nicht versucht, aber ich denke, das Folgende würde funktionieren ... versuche eine gespeicherte Prozedur in deiner Datenbank zu erstellen und führe sie in deinem C # Code entweder mit einem TableAdapter oder SqlCommand aus (du kannst auch noch Linq benutzen). Dein Code wird nicht wissen, dass du eine gespeicherte Prozedur ausführen willst, die kurz davor ist, ihre Verbindung zu beenden, damit sie funktioniert.

%Vor%

Jetzt können Sie diese gespeicherte Prozedur aus dem Code ausführen, und es werden offene Verbindungen, sogar Ihre eigenen, beendet. Viel Spaß!

    
waltmagic 07.05.2015 05:37
quelle
2

Dein erstes Problem (nachdem du deinen Code gepostet hast) ist, dass du zweimal aufrufst:

%Vor%

Als nächstes müssen Sie die Datenbank zurücksetzen, um alle Verbindungen zu schließen. Sie müssen eine separate Verbindungszeichenfolge verwenden, um eine Verbindung zu MASTER herzustellen, nicht die Datenbank, mit der Sie alle Verbindungen schließen möchten.

%Vor%

Sobald Sie das obige SQL von MASTER gegen die Datenbank ausgeführt haben, die zurückgesetzt werden muss, sollten Sie gut sein, zu tun, was auch immer Sie tun müssen. Denken Sie daran, eine Verbindung zum Master herzustellen !! Wenn Sie sich mit der Datenbank verbinden, die Sie zurücksetzen möchten, schließen Sie alle Verbindungen, einschließlich Sie selbst, die nicht funktionieren!

Ändern Sie Ihren Katalog in Master.

Beispiel Verbindungszeichenfolge ( from MSDN ):

%Vor%

Stellen Sie außerdem sicher, dass der von Ihnen verwendete SQL-Benutzer über vollständige Berechtigungen zum Verwalten verfügt. Sie tun dies, indem Sie das Management Studio öffnen und sich die Benutzer-Sammlung unter Master ansehen.

    
VulgarBinary 07.05.2015 05:33
quelle
1

Es empfiehlt sich, vor dem Öffnen zu prüfen, ob die Verbindung offen ist. Versuchen Sie, eine Überprüfung hinzuzufügen, bevor Sie versuchen, Ihre Verbindung zu öffnen, etwa so:

%Vor%

Dies wird helfen, das beschriebene Problem zu vermeiden.

    
Tom Miller 08.05.2015 20:39
quelle
0

Sie können SqlConnection verwenden. ClearAllPools und SqlConnection.ClearPool , um alle oder eine Verbindung in .NET zu schließen.

ClearPool löscht den Verbindungspool, der der Verbindung zugeordnet ist. Wenn zum Zeitpunkt des Aufrufs zusätzliche mit der Verbindung verknüpfte Verbindungen verwendet werden, werden sie entsprechend gekennzeichnet und werden verworfen (anstatt in den Pool zurückgegeben), wenn Close aufgerufen wird.

ClearAllPools setzt den Verbindungspool zurück (oder leert ihn). Wenn zum Zeitpunkt des Aufrufs Verbindungen in Verwendung sind, werden sie entsprechend gekennzeichnet und werden verworfen (anstatt in den Pool zurückgegeben), wenn Close aufgerufen wird.

für Beispiele:

%Vor%     
Behzad 07.05.2015 07:00
quelle
0

Sobald die Prüfung auf diese Weise durchgeführt wurde, sind dies meine Datenzugriffsschicht-Beispiele:

%Vor%     
Behzad 07.05.2015 09:24
quelle
Django: Verwenden von Annotate, Count und Distinct in einem Queryset Was ist Meta Charset="Utf-8"? [Duplikat] ___ tag123html ___ HTML (Hyper Text Markup Language) ist die Standard-Auszeichnungssprache, die zum Strukturieren von Webseiten und zum Formatieren von Inhalt verwendet wird. HTML beschreibt die Struktur einer Website semantisch zusammen mit Hinweisen für die Präsentation, wodurch sie eine Markup-Sprache statt einer Programmiersprache wird. Die neueste Revision der HTML-Spezifikation ist HTML5.2. ___ tag123utf8 ___ UTF-8 ist eine Zeichencodierung, die jeden Unicode-Codepunkt mit einer Bytefolge von ein bis vier Byte beschreibt. Es ist abwärtskompatibel zu ASCII und unterstützt weiterhin die Darstellung aller Unicode-Codepunkte. ___ answer29869838 ___

Die Zeichen, die Sie auf Ihrem Bildschirm lesen, haben jetzt jeweils einen numerischen Wert. Im ASCII-Format ist beispielsweise der Buchstabe "A" 65, "B" 66 und so weiter. Wenn Sie sich eine Tabelle von Zeichen anschauen, die in ASCII verfügbar ist, werden Sie sehen, dass sie für jemanden, der dies wünscht, nicht viel nutzt schreibe etwas in Mandarin, Arabisch oder Japanisch. Damit Zeichen / Wörter aus diesen Sprachen angezeigt werden können, benötigten wir ein anderes System, um sie zu und von Zahlen zu codieren, die im Computerspeicher gespeichert sind.

UTF-8 ist nur eine der Codierungsmethoden, die zur Implementierung dieser Anforderung entwickelt wurden. Es erlaubt Ihnen, Text in allen möglichen Sprachen zu schreiben, so dass französische Akzente vollkommen in Ordnung erscheinen, genauso wie Texte wie diese.

  

Бзиа збаша (Bzia zbaşa), Фэсапщы, Ç'kemi, ሰላም und sogar von rechts nach links   Schreiben wie dieses السلام عليكم

Wenn Sie den obigen Text kopieren und in den Editor einfügen und dann versuchen, die Datei als ANSI (ein anderes Format) zu speichern, erhalten Sie eine Warnung, dass das Speichern in diesem Format einen Teil der Formatierung verliert. Akzeptiere es, lade die Textdatei neu und du wirst etwas Ähnliches sehen.

  

???? ????? (Bzia zbasa), ???????, Ç'kemi, ???, und sogar von rechts nach links   Schreiben wie das ?????? ?????

    
___ qstntxt ___

Ich habe gerade angefangen, HTML zu lernen (ohne Programmierkenntnisse) und weiß nicht, was das bedeutet. Ich schreibe es generell, wenn ich den Code danach starte, habe aber keine Ahnung was es bedeutet. Ich weiß auch nicht, was Doctyp bedeutet. Was passiert, wenn ich es nicht benutze?

    
___ answer29869790 ___

Dieses Meta-Tag gibt im Grunde an, mit welchem ​​Zeichensatz Ihre Website geschrieben wurde.

Hier ist eine Definition von UTF-8:

  

UTF-8 (U aus Universal-Zeichensatz + Transformationsformat-8-Bit)   ist eine Zeichencodierung, die alle möglichen Zeichen codieren kann   (Codepunkte genannt) in Unicode. Die Codierung ist variabler Länge und   verwendet 8-Bit-Code-Einheiten.

    
___