2009-04-07 7 views
6

Diese in C# ist, Visual Studio 2008, Crystal Reports, die mit VS2008 kamCrystal Reports - schließen Sie die Datenbankverbindung

ich einen Crystal Report Viewer Form haben, die in einer DLL befindet. Die DLL ist verantwortlich für das Laden des Kristallberichts (basierend auf dem Dateinamen des Berichts) und für die Anzeige des Berichts im Formular.

Wenn ich mit dem Crystal-Bericht fertig bin, rufe ich das geladene Berichtsdokument-Objekt ab. Die Datenbankverbindung bleibt jedoch bestehen.

Crystal scheint zu erkennen, dass es andere Verbindungen (von meiner Hauptanwendung) zu derselben Datenbank gibt, und hält die Verbindung offen. Die Kristallverbindung wird geschlossen, wenn die Verbindung der Hauptanwendungsdatenbank geschlossen wird.

Gibt es eine Möglichkeit, Kristall zu zwingen, seine Verbindung zu schließen, ohne die Hauptanwendungsdatenbankverbindung zu schließen?

Antwort

0

Ich bin nicht vertraut mit Crystal Reports, aber es gibt viele Objekte, die eine nutzlose Dispose() -Methode aufgrund einer Vererbungskette haben, die die IDisposable-Schnittstelle enthält. Wenn auf dem Server keine Leistungsprobleme auftreten, machen Sie sich keine Sorgen. Der GC kümmert sich um die Verbindungen auf den Clients, wenn diese bereit sind. Sie sollten nicht versuchen, schlauer zu sein als der GC, Sie werden sich nur noch mehr Kopfzerbrechen bereiten.

Und immer Dispose() (oder mit {}) aufrufen, wenn es verfügbar ist.

+0

Dies ist wirklich über die Datenbankverbindung. Die Hauptanwendung verfügt über Funktionen zum Wiederherstellen und Sichern der Datenbank. Die Crystal Db Verbindung verhindert dies. Ich habe mich auf google herumgetrieben, und wenn ich den Bericht veröffentliche, wird die Verbindung geschlossen, aber nur, wenn nur Crystal verbunden ist. – user87945

+0

Ich gehe davon aus, dass Sie MSSQL verwenden, richtig? Warum nicht die eingebaute Sicherung/Wiederherstellung von dort verwenden? – Ariel

+0

, da das Produkt für Nicht-Techniker konzipiert wurde. Zwei Menüpunkte zu haben, die Backup/Restore sagen ist viel einfacher zu verstehen, dann gehen Sie in Sql Management Studio, melden Sie sich als Benutzer, der diese privs etc. – user87945

1

Wie stellen Sie eine Verbindung zur Datenbank her, indem Sie zur Laufzeit eine eigene Verbindung erstellen, indem Sie die Authentifizierung festlegen, oder lässt Crystal die Verbindung über die gespeicherte Verbindung im Bericht herstellen? Wenn Sie Ihre eigene Verbindung in irgendeiner Form, Form oder Form herstellen, müssen Sie die Verbindung manuell schließen und den Disposal aufrufen, bevor Sie den Bericht entsorgen.

Es ist durchaus möglich, dass dies ein Speicherleck ist. Ich habe diese schon einmal erlebt. Es gibt auch ein Speicherleck-Problem mit Crystal Reports und es wird viel über das Forum gesprochen, aber es wurde kein Update herausgegeben, als ich es vor ein paar Jahren benutzt habe. Ich habe Crystal für andere Optionen aufgegeben.

0

Ich hatte das gleiche Problem, außer dass ich Sybase verwende. Vor einiger Zeit habe ich den Code, den ich geschrieben habe, gepostet, um die Verbindung zu entfernen (und das hat nicht funktioniert), als ich einen Fehler sah! Ich habe den Fehler behoben, und, meine Daumen drücken, jetzt scheint es zu funktionieren. Ich habe fast 100 Berichte geöffnet, in denen ich vorher keine 10 öffnen konnte. Wenn Sie dies versuchen, lassen Sie mich bitte wissen, ob es für Sie funktioniert. Hier

ist, was ich tue, kurz bevor ich das Fenster zu schließen, die den Crystal Reports Viewer enthält:

var rd = (ReportDocument)crystalReportViewer1.ReportSource; 
foreach (Table table in rd.Database.Tables) 
    table.Dispose(); 
rd.Database.Dispose(); 
rd.Close(); 
rd.Dispose(); 
GC.Collect(); 

Mark

0

Marks Code, um die Situation zu etwas zu lindern scheint, obwohl es ein bisschen nach hinten ist , sollte so etwas wie sein:

Dies hat das Leck für mich nicht vollständig verstopft, aber sicherlich geholfen.