Ms access Crystal Report(XI RDP)将继续访问数据库

Ms access Crystal Report(XI RDP)将继续访问数据库,ms-access,vb6,crystal-reports,.net,Ms Access,Vb6,Crystal Reports,.net,我们的VB6应用程序使用多个MS Access数据库,这些数据库表示不同的结果集。当用户选择结果集时,包含该结果集的数据库将在用户需要其数据时重命名为Temp.mdb。用户完成后,Temp.mdb将重命名为其原始名称。(请接受这个设计,当时有很好的理由) 这种设计的一个缺陷是,当存在到Temp.mdb的开放连接时,重命名失败,并出现权限拒绝错误。因此,在我们的代码中,所有连接都是事先精心关闭的 输入Crystal报告: 我们使用CraxDRT.Application.OpenReport(pat

我们的VB6应用程序使用多个MS Access数据库,这些数据库表示不同的结果集。当用户选择结果集时,包含该结果集的数据库将在用户需要其数据时重命名为Temp.mdb。用户完成后,Temp.mdb将重命名为其原始名称。(请接受这个设计,当时有很好的理由)

这种设计的一个缺陷是,当存在到Temp.mdb的开放连接时,重命名失败,并出现权限拒绝错误。因此,在我们的代码中,所有连接都是事先精心关闭的

输入Crystal报告: 我们使用CraxDRT.Application.OpenReport(path)创建一个报告,将其传递给一些网络dll以设置其参数,然后将其发送到CRViewer或打印机。在这之后,报告似乎一直在徘徊,并与Temp.mdb保持打开的连接,从而对Temp.ldb进行写保护。我试图将Vb6和Net中对报表的所有引用设置为null/Nothing,但报表本身没有IDispose接口、Close方法或其他任何方法。只有当我关闭主应用程序时,与数据库的连接才会消失。重新启动后,我可以重命名它

必须有一种方法来释放报告对Temp.ldb文件的锁定,以便我可以重命名Temp.mdb。但是怎么做


PS:奇怪的是,当我调用一个使用相同数据但没有传递到Net dll的不同报告时,以某种方式,延迟报告会被垃圾收集并释放其锁。

如果不是垃圾收集问题,则可能是.Net/OLEDB提供程序CR使用的连接池。虽然通常不为JET数据库启用


您可以将报告逻辑包装在一个单独的可执行文件中,该文件启动CR viewer或打印报告,然后退出,从而有效地强制GC和/或清除打开的连接。

是什么逻辑驱动报告的数据源?你正在打开任何记录集吗?您是否需要在代码中包含Close方法?您可以尝试使用NirSofts OpenedFileView查看到底是什么使数据库保持打开状态:@HK1报告有自己的查询,它使用系统DSN在数据库上执行这些查询。如果有一个Report.Close、Report.Dispose等方法,但没有。可能是一个愚蠢的问题,但您是否可以控制报表数据源,以便关闭连接?(我无知地说,我从来没有使用过Crystal Reports)。@HK1是的,如果有人能告诉我如何使用DAO强制关闭与数据库的所有连接,我就自由了。”…使用DAO强制关闭与数据库的所有连接”我想你是说从“外部”关闭?我不知道在没有连接参考的情况下这是可能的。这可能是正确的方法,但我觉得它太麻烦了。我还原了一些移植到Net的代码,这样就不会对数据库进行引用。我们将看到当我们将整个Crystal Reports代码从VB6迁移到Net时会发生什么。