0

我们的 VB6 应用程序与代表不同结果集的多个 MS-Access 数据库一起工作。当用户选择一个结果集时,包含该结果集的数据库将重命名为 Temp.mdb,以供用户在需要其数据时使用。用户完成后,Temp.mdb 将重命名为其原始名称。(请接受这个设计,当时是有充分理由的)。

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

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

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

PS:奇怪的是,当我调用一个使用相同数据但没有传递给 Net dll 的不同报告时,以某种方式,挥之不去的报告被垃圾收集,它也释放了它的锁。

4

1 回答 1

2

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

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

于 2012-04-13T18:26:11.247 回答