【问题标题】:MS Access: There isn't enough memory to perform this operationMS Access:没有足够的内存来执行此操作
【发布时间】:2010-12-07 05:23:12
【问题描述】:

我在具有 4GB RAM 的双核机器上使用 Access 2003,运行 Windows XP (Service Pack 3) [5.1.2600]

定期,我收到一条错误消息“没有足够的内存来执行此操作。关闭不需要的程序并重试该操作。”

检查任务管理器表明有大量可用内存。关闭其他打开的程序没有区别。

这种情况偶尔会发生,并且在不同的情况下:有时在保存表单设计或 VBA 代码更改时,有时在打开并使用多个表单时。

如果尝试保存设计更改并发生此错误,则 Access 对象已损坏且无法恢复。

非常欢迎就可能导致此问题的原因提出任何建议。

MTIA

【问题讨论】:

    标签: ms-access memory ms-access-2003


    【解决方案1】:

    您前端的 VBA 项目可能已损坏。您需要从头开始重建它,然后使用正确的 Access 编码实践:

    1. 在 VBE 选项中,关闭 COMPILE ON DEMAND(有关原因的详细信息,请参阅 Michael Kaplan's article on DECOMPILE)。

    2. 在 VBE 选项中,打开 REQUIRE VARIABLE DECLARATION。

    3. 在 VBE 中,自定义您的工具栏,以便轻松访问“编译”按钮(它位于“调试”菜单上)。我还建议添加 CALL STACK 按钮(从 VIEW 菜单中),因为它可以方便地在中断模式下调试错误。这里的重点是让调试和编译尽可能简单。

    4. 设置好环境后,检查新恢复的项目中的所有模块,并将 OPTION EXPLICIT 添加到缺少它的每个模块的顶部。然后编译。您会很快发现哪里有无效代码,您需要修复它。

    5. 从现在开始,在编程时,经常编译,每两三行代码之后。在编码时,我可能每天编译我的项目 100 次或更多次。

    6. 定期反编译您的项目并压缩并重新编译它。这将清除在常规开发过程中积累的任何污垢。

    这些做法可确保非损坏项目中的代码尽可能保持干净。它无法恢复已经损坏的项目。

    关于如何重建项目,我想我会走极端路线,用 Application.SaveAsText 导出所有对象,然后用 Application.LoadFromText 将它们导入一个新的空白数据库。这比简单地从现有损坏的前端导入要好,因为导入可以导入无法在 SaveAsText/LoadFromText 循环中存活的损坏结构。

    我每天都在 Access 中编程,使用大量代码(包括大量独立类模块)的非平凡应用程序。 5 年多来我没有因为代码损坏而丢失过一个对象,那是在我还在使用 A97 的那一天。

    【讨论】:

    • 谢谢大卫。回复 1,那是做什么的? (Michael Kaplan 的文章中没有涉及) 2:始终开启。 3:我总是在每次代码更改后编译。 4:总是用这个。 5:我也编译了很多。 6:我也经常反编译/重新编译。我也每天使用 Access 工作,大约 10 年。没有丢失任何代码——我也有很多 VBA 模块/类——但偶尔会收到损坏的表单或报告。但最近我收到了这个“记忆”错误。今天我丢失了大部分表格和所有报告!幸运的是,我有昨天所有对象的文本备份,并使用 LoadFromText 恢复表单和报告。
    • 这篇文章解释了为什么你不想要增量编译,因为它们增加了 VBA 必须跟踪的编译级别的数量。显式编译是完整的编译。您可能需要查看关于按需编译的帮助文件文章(在查看 OPTION | GENERAL 选项卡时按 F1)。
    【解决方案2】:

    偶然发现了我的这篇旧帖子,并且看到它有相当多的兴趣,我想也许应该更新一下?

    所以在 2 年的时间里,我做了很多 2007 年的应用程序以及较旧的 2003 年(甚至 97 年)应用程序,我发现 2007 年比 2003 年更不容易发生真正令人讨厌的崩溃 - 其中 Access 对象定义(尤其是表格和报告)很容易损坏。

    尽管如此,我仍然虔诚地遵循 David-W-Fenton 的建议 1-6(上),以及 Application.SaveAsText 的使用(参见 Tony Toews 的建议和上面的链接)。

    这些天,无论是 97 年、2003 年还是 2007 年,如果 Access 给出 任何 提示“很奇怪 | 崩溃 | 抛出莫名其妙的错误”等,我执行以下操作:

    1. 立即关闭 Access 应用程序
    2. 备份 mdb/accdb 文件
    3. 在按住 [Shift] 的同时重新打开应用程序,这样就不会运行了
    4. 使用 Application.SaveAsText 将所有对象导出为文本(作为另一个备份)
    5. 使用 /decompile 开关关闭并重新打开应用程序
    6. 重新编译 VBA 代码
    7. 进行压缩/修复。

    这并不能解决所有问题,但它确实大大减少了我能够观察到的 Access 对象损坏的数量。

    【讨论】:

      【解决方案3】:

      天哪。

      我在一家使用 Access 作为首选平台的商店工作了多年。该应用程序最终变得如此之大,以至于它开始达到 Access 2003 的内部内存限制。他们开始遇到与您完全相同的问题。正如您所注意到的,当这种情况发生时,没有外部内存问题的迹象。

      公司与微软详细讨论了这个问题,我相信微软最终为他们提供了补丁。因此,如果这听起来与您所遇到的情况相似,您可能想与 Microsoft 谈谈,因为他们可能会为您提供相同的补丁。

      最终的长期解决方案是将应用程序分解成更小的部分。迁移到 Access 2007 并没有帮助。事实上,这让事情变得更糟,因为 Access 2007 有更多的活动部件。

      【讨论】:

      • 谢谢罗伯特。这个应用程序真的很小,大约 40 个表单和子表单,报告也一样,大约 11,000 行 VBA 代码。至于 MS 支持,我几年前就放弃了:当我发现他们的应用程序中有错误时付钱给他们不是我的一杯茶 :)
      • 如果您订阅了 MSDN,您将获得免费事件。在这种特殊情况下,微软应该免费提供补丁。
      【解决方案4】:

      快速解决方案;保证工作:

      打开 VBA (Alt-F11) 在即时窗口中输入以下内容:

      Application.SaveAsText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive"
      

      然后

      Application.LoadFromText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive"
      

      就是这样 :) 希望这对其他人有帮助!

      【讨论】:

      • 执行Application.LoadFromText acForm, "corrupt form name here", CurrentProject.Path & "\zzTempRevive" 语句后,可能会在errors.txt 中发现一些错误。修复错误然后再次运行语句。
      【解决方案5】:

      这也是当 Access 不知道问题究竟是什么时的默认错误消息。现在,如果您的 MDB 非常大,比如说超过 800 个带有模块的表单和报告,那么 MDB 可能太大了,尽管在您创建 MDE 时这会给您一个消息。 ACC2000: "Microsoft Access Was Unable to Create an MDE Database" Error Message

      我自己也偶尔发生过这种情况。而且我目前的 MDB 并没有那么大。请注意,除了表、索引或关系之外,压缩和修复不会检测对象中的错误。因此,导入另一个 MDB 是纠正这些错误的唯一方法。

      您是否正在通过网络处理此 MDB?这是我能想到的唯一可能导致此问题的事情。

      【讨论】:

      • 嗨托尼:应用程序很小。确实,压缩/修复没有用,所以我将所有对象导入到新的 mdb。该应用程序是开发时坐在我本地驱动器上的 FE/BE。我已经开始通过未记录的函数 Application.SaveAsText 备份对象,然后通过 Application.LoadFromText 来恢复无法导入的损坏对象。不过这很费力,而且 Access 的不稳定性让我担心,因为它偶尔也会发生在用户身上。
      • Max,在 Corrupt Objects in a Corrupt Microsoft Access MDB granite.ab.ca/access/corruption/corruptobjects.htm 的其中一个链接上有一个工具,它将执行所有对象。我当然也会回顾 David 的建议,尽管我不确定是否是 VBA 损坏了。
      • 谢谢托尼。我的功能与 Arvin Meyer 的功能非常相似。作为我备份策略的一部分,它将所有对象转储到一个带时间戳的文件夹中,我每天都会使用很多次。我已经导出了几个损坏的表单,并注意表单描述被替换为 ????????等等,但 VBA 似乎没问题。
      【解决方案6】:

      据我所知,最有可能损坏的是表单或报告,因此我创建了一个新的 mdb,并且只导入了表(附加)、查询、脚本(只有一个)、模块和菜单。然后我使用LoadFromText通过一个函数导入Forms和Reports,然后进行通常的反编译/压缩/修复等操作。

      到目前为止,触摸木头,我已经有几天没有再次崩溃了,所以我可能会坚持这种恢复方法。

      非常感谢大家的建议。

      【讨论】:

      • FWIW,自从使用 LoadFromText 以来,我已经有大约 4 周没有发生严重的崩溃,因此上述使用 SaveAsText 和 LoadFromText 的备份和恢复方法似乎是最值得的。
      【解决方案7】:

      我多次遇到这个问题,终于找到了一个可行的解决方案。我不知道是什么导致了这个问题,但我知道如何解决它。

      通常当您打开表单时会发生错误。您需要做的是完全重新创建该表单。最简单的方法是首先使用未记录的函数 Application.SaveAsText 将表单导出到文本文件。然后从数据库中删除表单并使用 Application.LoadFromText 重新加载它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-26
        • 1970-01-01
        • 1970-01-01
        • 2019-10-15
        • 2011-08-24
        • 2019-01-13
        相关资源
        最近更新 更多