Crystal Reports – ferme la connection à la database

Ceci est en C #, Visual Studio 2008, les rapports de cristal qui sont venus avec VS2008

J'ai un formulaire de visionneuse de rapport de cristal qui réside dans une DLL. La DLL est responsable du chargement du rapport Crystal (basé sur le nom du file de rapport) et de l'affichage du rapport sur le formulaire.

Lorsque j'en ai fini avec le rapport Crystal, j'appelle disposer sur l'object reportdocument chargé. Cependant, la connection à la database rest.

Crystal semble détecter qu'il y a d'autres connections (de mon application principale) à la même database, et garde sa connection ouverte. La connection Crystal est fermée lorsque la connection à la database des applications principales est fermée.

Existe-t-il un moyen de forcer Crystal à fermer sa connection, sans fermer la connection à la database des applications principales?

Comment vous connectez-vous à la database en créant votre propre connection au moment de l'exécution en définissant l'authentification ou laissez-vous faire la connection à Crystal via la connection stockée dans le rapport? Si vous faites votre propre connection de quelque manière que ce soit, formez ou formez, vous devez fermer manuellement la connection et appeler l'élimination avant de disposer du rapport.

Il est tout à fait possible que ce soit une fuite de memory. J'ai déjà vécu ça. Il y a aussi un problème de fuite de memory avec Crystal Reports et on en parle beaucoup sur leur forum mais aucune correction n'a été publiée lorsque je l'utilisais il y a quelques années. J'ai abandonné Crystal pour d'autres options.

Je ne connais pas très bien Crystal Reports, mais de nombreux objects ont une méthode Dispose () inutile en raison d'une string d'inheritance qui inclut l'interface IDisposable. Si vous ne voyez aucun problème de performances sur le server, ne vous inquiétez pas. Le GC prendra soin des connections sur les clients quand il est prêt. Vous ne devriez pas essayer d'être plus intelligent que le GC, vous vous ferez plus de mal à la tête.

Et, appelez toujours Dispose () (ou en utilisant {}) quand il est disponible.

J'ai eu le même problème, sauf que j'utilise Sybase. Il y a quelque time, je publiais le code que j'avais écrit pour disposer de la connection (et cela ne fonctionnait pas) quand j'ai vu une erreur! J'ai corrigé l'erreur, et, croisant mes doigts, maintenant il semble fonctionner. J'ai ouvert près de 100 rapports où je ne pouvais pas ouvrir 10 auparavant. Si vous essayez ceci, s'il vous plaît laissez-moi savoir si cela fonctionne pour vous.

Voici ce que je fais juste avant de fermer la window qui contient le visualiseur Crystal Reports:

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

marque

Le code des marques semble un peu soulager la situation bien qu'il soit un peu en retrait, devrait être quelque chose comme:

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

Cela n'a pas complètement branché la fuite pour moi mais a certainement aidé.