这是在C#,Visual Studio 2008,VS2008附带的水晶报告中
我有一个位于DLL中的水晶报表查看器表单 . DLL负责加载水晶报告(基于报告文件名),并在表单上显示报告 .
当我完成水晶报告后,我在已加载的reportdocument对象上调用dispose . 但是,数据库连接仍然存在 .
Crystal似乎检测到有其他连接(从我的主应用程序)到同一个数据库,并保持其连接打开 . 关闭主应用程序数据库连接时,晶体连接将关闭 .
有没有办法迫使水晶关闭它的连接,而没有关闭主应用程序数据库连接?
4 回答
如何通过设置身份验证在运行时创建自己的连接,或者让Crystal通过报告中存储的连接进行连接,如何连接到数据库?如果您以任何方式,形状或形式进行自己的连接,则必须手动关闭连接并在处理报告之前调用dispose .
这很可能是内存泄漏 . 我以前经历过这些 . Crystal Reports也存在内存泄漏问题,并且在他们的论坛上谈了很多但几年前我使用它时没有发布修复 . 我为其他选择抛弃了水晶 .
我不太熟悉Crystal Reports,但由于包含IDisposable接口的继承链,有许多对象具有无用的Dispose()方法 . 如果您没有在服务器上看到任何性能问题,请不要担心 . GC准备就绪后,将负责客户端上的连接 . 你不应该试图比GC更聪明,你只会给自己带来更多的麻烦 .
并且,当它可用时,始终调用Dispose()(或使用{}) .
除了我正在使用Sybase之外,我遇到了同样的问题 . 不久之前,当我看到错误时,我发布了我编写的代码来处理连接(并且没有用)!我修正了错误,并且,交叉我的手指,现在它似乎工作 . 我打开了近100份报告,之前我无法打开10个 . 如果你试试这个,请告诉我它是否适合你 .
在关闭包含Crystal Reports查看器的窗口之前,我正在做的就是:
标记
标记代码似乎在某种程度上缓解了这种情况,虽然它有点倒退,应该是这样的:
这对我来说并没有完全堵塞泄漏,但肯定有帮助 .