Crystal报告 – 关闭数据库连接

这是在C#,Visual Studio 2008,VS2008附带的水晶报告中

我有一个位于DLL中的水晶报表查看器表单。 DLL负责加载水晶报告(基于报告文件名),并在表单上显示报告。

当我完成水晶报告时,我在已加载的reportdocument对象上调用dispose。 但是,数据库连接仍然存在。

Crystal似乎检测到有其他连接(从我的主应用程序)到同一个数据库,并保持其连接打开。 关闭主应用程序数据库连接时,晶体连接将关闭。

有没有办法强制晶体关闭它的连接,而没有关闭主应用程序数据库连接?

如何通过设置身份validation在运行时创建自己的连接,或者让Crystal通过报告中存储的连接进行连接,如何连接到数据库? 如果您以任何方式,形状或forms进行自己的连接,则必须手动关闭连接并在处置报告之前调用dispose。

这很可能是内存泄漏。 我以前经历过这些。 Crystal Reports也存在内存泄漏问题,并且在他们的论坛上谈了很多,但几年前我在使用它时没有发布修复程序。 我为其他选择抛弃了水晶。

我不太熟悉Crystal Reports,但由于包含IDisposable接口的inheritance链,有许多对象具有无用的Dispose()方法。 如果您没有在服务器上看到任何性能问题,请不要担心。 GC准备就绪后,将负责客户端上的连接。 你不应该试图比GC更聪明,你只会给自己带来更多的麻烦。

并且,当它可用时,始终调用Dispose()(或使用{})。

除了我正在使用Sybase之外,我遇到了同样的问题。 不久之前,当我看到错误时,我发布了我编写的代码来处理连接(并且没有用)! 我修正了错误,并且,交叉我的手指,现在它似乎工作。 我已经打开了近100份报告,之前我无法打开10个。 如果你试试这个,请告诉我它是否适合你。

这是我在关闭包含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(); 

标记

标记代码似乎在某种程度上缓解了这种情况,虽然它有点倒退,应该是这样的:

 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(); 

这对我来说并没有完全堵塞泄漏,但肯定有帮助。