首页 文章

Crystal报告 - 关闭数据库连接

提问于
浏览
6

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

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

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

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

有没有办法迫使水晶关闭它的连接,而没有关闭主应用程序数据库连接?

4 回答

  • 0

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

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

  • 0

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

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

  • 1

    除了我正在使用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();
    

    标记

  • 0

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

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

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

相关问题