如何等待 Compact Repair - 访问 VBA

Posted

技术标签:

【中文标题】如何等待 Compact Repair - 访问 VBA【英文标题】:How to wait for Compact Repair - Access VBA 【发布时间】:2013-04-21 15:00:26 【问题描述】:

在 Access 2007 中有一个 VBA 模块,它在 For 循环中执行类似的操作。 在每个循环结束时,我希望在进行下一次迭代之前压缩和修复当前数据库。

原因:在我创建的每个迭代中,用于计算并删除一个表。 大小应保持在可控范围内。

使用 SendKeys ,我无法压缩和修复 - 如果从表单按钮调用模块。 确保 SendKey 正常工作并且模块完美地继续下一次迭代的任何技巧。控制表单加载/模块执行/检查状态等的一些想法。 最终目的是等待足够长的时间直到压缩完成然后继续。还有如何安全地确保用于压缩的 SendKeys /(建议备用)工作正常。

谢谢

【问题讨论】:

MS Access: how to compact current database in VBA的可能重复 另一个问题是相似的,因为它也处理紧凑。但是,这个问题询问了 For 循环内的压缩...多次压缩当前数据库,这意味着它必须在压缩前后保留循环的状态。除了简单的紧凑型之外,这完全是另一个层次的复杂性。 MS Access 保持较大的大小是有原因的 - 它声称它知道它可以使用一些磁盘空间。如果您的下一段代码只是再次扩展它,我不确定缩小的意义何在? 【参考方案1】:

"... 在 For 循环中。在每个循环结束时,我希望在进行下一次迭代之前压缩并修复当前数据库。"

考虑压缩当前数据库时实际发生的情况。 Access 首先将当前数据库的压缩版本创建为 new db 文件。然后它删除旧的 db 文件,将新文件重命名为旧名称,最后打开新的 db 文件。

因此,如果您的代码尝试通过 For 循环在每个循环中压缩...当 Access 然后打开压缩的 db 文件...它怎么知道您希望它继续在 For 循环中?

如果你真的想做这样的事情,你必须存储一个值来记录 For 循环的最后一次迭代。然后创建一个 autoexec 宏以在数据库打开时检索该值,并在适当的循环中输入For 循环。然后决定您是否真的希望每次打开数据库时都发生这一切。

然而,这对我来说似乎太过分了。使用另一个数据库文件来保存您的易失性数据应该更简单。然后从 current 数据库中的代码中,您可以使用DBEngine.CompactDatabase 压缩外部 db 文件。

【讨论】:

【参考方案2】:

如果您要进行如此紧凑和修复,那么我会将数据库拆分为前端和后端。您的所有表格都将位于后端。无论如何,拆分数据库对于任何普通的 Access 程序员来说都是相当标准的。

然后,当您需要时,使用 Shell 命令通过 /compact 开关打开后端数据库。这将打开它,进行压缩和修复,然后将其关闭。

所以,您的代码将是这样的:

Ret = Shell("C:\Program Files\Microsoft Office\Office12\MSACCESS.EXE /compact c:\MyFolder\MyDB.accdb")

如果您需要等待它完成,请改用 WScript.Shell 命令。

祝你好运

【讨论】:

另一种可能是DBEngine.CompactDatabase "C:\__tmp\tempDB.accdb", "C:\__tmp\newTempDB.accdb",它将发生在当前的 Access 实例中(并将等待)。 没用过那个方法。它可以压缩到同一个数据库中,还是需要一个新的数据库? 使用DBEngine.CompactDatabase时,目标数据库必须不存在,所以是的,它坚持制作一个新的数据库文件。 很高兴知道我是否需要备份数据库,但我认为它不能解决 OP 的需求。【参考方案3】:

您不能在任何类型的循环中压缩和修复当前数据库。您可以在循环中压缩和修复外部数据库,或者您可以在关闭时压缩当前数据库。

【讨论】:

【参考方案4】:

我已经回复了您的other question(非常相似),但是为了帮助其他人,我发布了一个简单的实用函数,可以帮助您重新启动和压缩当前数据库:

Restarting and compacting an MSAccess database programmatically

为确保您在重新启动后继续正确的迭代:

将操作状态(例如循环计数)保存在数据库中的LocalSettings 表中(例如)。 重新启动。 使用autoexec 宏来启动执行您工作的函数:它应该从LocalSettings 表中加载操作/循环计数并继续执行。

另一种解决方案是修改重启函数,将自定义命令行参数传递给 Access 应用程序,您可以在应用程序重启时检查该参数。 您可以轻松检查命令行参数,请参阅 VBA Command function。

【讨论】:

以上是关于如何等待 Compact Repair - 访问 VBA的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 磁盘空间啥时候释放

SQL Compact Edition - 不允许访问数据库文件

SQL Server Compact 3.5 版数据库访问被拒绝

在 Visual Studio 2010 C# 中不允许访问数据库文件 (SQL Server Compact)

如何在 NSIS 脚本中使用 REMOVE 或 REPAIR 功能?

Compact Framework - System.Threading.Timer 在用户关闭屏幕时停止