【问题标题】:MS Access VBA: how to trap case where delete hangs due to low memory or disk space?MS Access VBA:如何捕获由于内存或磁盘空间不足而导致删除挂起的情况?
【发布时间】:2016-11-10 23:15:58
【问题描述】:

我在 MS Access 2007 中遇到了一个我无法可靠重现的零星错误。具体情况如下:

  1. 将 500K+ 行文本数据从文件加载到表中
  2. [用加载的数据做事]
  3. 尝试从 vba 中删除表的内容 CurrentDB().Execute "Delete * from RawImport",其中 RawImport 是表名

在第 3 步,代码有时会挂起,直到我按 ctrl-Break。发生这种情况时,如果 Ctrl-F11 回到数据库视图并尝试删除表的内容,它总是会给我一个错误“没有足够的内存或磁盘空间来完成此操作,请执行你想继续”(意译,我无法捕捉到错误)

退出访问并重新加载通常会清除此问题,以便 VBA 代码运行,这一切都很好,但我该如何捕获呢?它不会在删除时在 vba 中生成错误,它只是坐在那一行,直到我手动中断。

【问题讨论】:

  • 我认为这对于 msAccess 来说数据过多,您有损坏数据库的风险。如果可能,您应该改用 MSSQL。我也期待有人回答
  • 在处理过程中观察 Access DB 的大小,看看文件在处理过程中增长了多大。我猜你遇到了 2GB 的大小限制
  • "用 undo 完成这个动作" --- 所以你确实想继续,但你没有提供任何输入来这样做。尝试查看是否有另一种方法可以删除带有“忽略撤消”输入的表,或者是否有其他方法,如 runsql
  • 是否可以选择删除表并重建为空表?
  • Hynek 不正确。 500k 行对于 Access 来说并不算多。按照建议,检查文件大小。你能发布相关代码吗?您可能会遇到更少的问题是您声明一个数据库变量,而不是使用 CurrentDb()。将 dbS 调暗为 dao.Database 设置 dbS = CurrentDb() sbS.Execute , dbFailOnError。 UI 警告仅与 UI 有关。它只是告诉你,一旦删除记录,就无法撤消。

标签: vba ms-access error-handling low-memory


【解决方案1】:

最后,我确实遵循了创建临时数据库的方法,在该数据库中动态创建表,从我的主数据库链接它,然后在每个加载/处理周期删除临时数据库。它工作正常,但对于一个非常简单的数据库用例来说有点过于复杂 - 不难看出为什么人们如此容易地超越 Access。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    相关资源
    最近更新 更多