MS Access: недостаточно памяти для выполнения этой операции

Я использую Access 2003 на двухъядерной машине с 4 ГБ ОЗУ под управлением Windows XP (пакет обновления 3) [5.1.2600]

периодически я получаю сообщения об ошибке "недостаточно памяти для выполнения этой операции. Закройте ненужные программы и повторите операцию."

проверить Диспетчер задач показывает, что есть много свободной памяти. Закрытие других открытых программ не имеет значения.

это происходит спорадически и при разных обстоятельствах: иногда при сохранении дизайна формы или изменения кода VBA, иногда, когда несколько форм открыты и используются.

при попытке сохранить изменения дизайна, и эта ошибка возникает, объекты доступа повреждены и не могут быть восстановлены.

любые предложения о том, что может быть причиной этого, будут очень приветствоваться.

приводе mtia

7 ответов


проект VBA в вашем интерфейсе, вероятно, поврежден. Вам нужно перестроить его с нуля, а затем использовать правильные методы кодирования доступа:

  1. в параметрах VBE отключите компиляцию по требованию (см. статья Майкла Каплана о декомпиляции подробности почему).

  2. в параметрах VBE включите требование объявления переменной.

  3. в VBE настройте панель инструментов так, чтобы кнопка компиляции была легко доступный (он находится в меню Debug). Я также рекомендую добавить кнопку стека вызовов (из меню Вид), так как это удобно для отладки ошибок в режиме перерыва. Дело в том, чтобы сделать отладку и компиляцию как можно проще.

  4. настроив свою среду, пройдите все модули в вашем недавно восстановленном проекте и добавьте опцию EXPLICIT в верхнюю часть каждого модуля, которому ее не хватает. Затем компилировать. Вы быстро узнаете, где у вас есть недопустимый код, и вам понадобится исправить это.

  5. отныне при программировании компилируйте часто, через каждые две-три строки кода. Я, вероятно, компилирую свой проект 100 или более раз в день при кодировании.

  6. периодически декомпилируйте свой проект и компактируйте и перекомпилируйте его. Это очистит любой crud, который накапливается во время регулярного развития.

эти методы гарантируют, что код в неповрежденном проекте остается в чистом состоянии по возможности. Он ничего не сделает для восстановления уже поврежденного проекта.

Что касается того, как перестроить проект, я думаю, что я бы пошел по радикальному пути экспорта всех объектов с приложением.SaveAsText и импорт их в новую пустую базу данных с приложением.LoadFromText. Это превосходит простой импорт из существующего поврежденного интерфейса, поскольку импорт может импортировать поврежденные структуры, которые не переживут цикл SaveAsText/LoadFromText.

I программа ежедневно в доступе, работает с нетривиальными приложениями, которые используют много кода, включая множество автономных модулей класса. Я не потерял объект для коррупции кода более 5 лет, и это было еще в тот день, когда я все еще использовал A97.


наткнувшись на этот мой старый пост, и видя, что у него был изрядный интерес, я подумал, что, может быть, обновление будет в порядке?

Итак, 2 года вниз по дорожке, делая много работы приложения 2007 года, а также более старые приложения 2003 (и даже '97), я нахожу, что 2007 менее подвержен действительно неприятным сбоям, чем 2003 - где определения объектов доступа (формы и отчеты esp.) будет легко поврежден.

Я по-прежнему следую предложениям 1-6 (выше) Дэвида-W-Fenton религиозно, хотя, плюс использование приложения.SaveAsText (см. предложение Тони Toews и ссылку выше).

в эти дни, будь то 97, 2003 или 2007 я работаю, если доступ дает любой намек на "странный | авария | бросая непонятные ошибки" etc, я делаю следующее:

  1. сразу закрыть приложение Access
  2. резервное копирование файла mdb / accdb
  3. откройте приложение удерживая [Shift] , так что ничего не работает
  4. экспорт всех объектов в виде текста с помощью приложения.SaveAsText (как еще одна резервная копия)
  5. закройте и снова откройте приложение с помощью переключателя / decompile
  6. перекомпилировать код VBA
  7. сделайте компакт / ремонт.

Это не решает все, но это значительно уменьшает количество искажений объектов доступа от того, что я могу наблюдать.


О мой.

Я работала в магазине много лет, что б доступ к их платформе. Приложение в конечном итоге стало настолько большим, что оно начало поражать внутреннее ограничение памяти Access 2003. Они начали испытывать ту же самую проблему, что и вы. Как вы заметили, нет никаких внешних признаков проблем с памятью, когда это произойдет.

компания долго говорила с Microsoft о проблеме, и я считаю, что Microsoft в конце концов снабдил их заплаткой. Таким образом, вы можете поговорить с Microsoft об этом, если это звучит как аналогичная ситуация с тем, что вы испытываете, поскольку они могут предоставить вам тот же патч.

в конечном счете долгосрочное решение состоит в том, чтобы разбить приложение на более мелкие части. Переход на Access 2007 не помог; на самом деле, это ухудшило ситуацию, потому что Access 2007 имеет больше движущихся частей.


быстрое решение; гарантированный для работы:

открыть VBA (Alt-F11) В окне непосредственно введите следующее:

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

затем

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

вот и все :) надеюсь, это поможет другим!


Это также сообщение об ошибке по умолчанию, когда Access не имеет понятия, в чем проблема на самом деле. Теперь, если ваш MDB особенно велик, скажем, более 800 форм и отчетов с модулями, да, MDB может быть слишком большим, хотя это дало вам сообщение, когда вы пошли создавать MDEs. ACC2000:" Microsoft Access не удалось создать базу данных MDE " сообщение об ошибке

У меня это иногда случалось. И мои нынешние МБР не настолько велики. Обратите внимание, что compact и repair не обнаруживает ошибок в объектах, отличных от таблиц, индексов или связей. Поэтому импорт в другой MDB-единственный способ исправить эти ошибки.

вы работаете над этим MDB по сети? Это единственное, что я могу придумать, что может вызвать эту проблему.


поскольку я знаю, что это либо формы, либо отчеты, которые, скорее всего, будут повреждены, я создал новый mdb, и только импортированные таблицы (прикрепленные), запросы, скрипты (только один), модули и меню. Затем я использовал LoadFromText для импорта форм и отчетов через функцию, а затем сделал обычную декомпиляцию/компиляцию и компакт/ремонт и т. д.

до сих пор, прикоснитесь к дереву, у меня не было другой аварии в течение нескольких дней, поэтому я, вероятно, буду придерживаться этого метода восстановления.

большое спасибо всем за свои предложения.


Я сталкивался с этой проблемой много раз и, наконец, нашел решение, которое сработало. Я не знаю, что вызывает проблему, но я знаю, как ее решить.

обычно эта ошибка возникает при открытии формы. Что вам нужно сделать, это полностью воссоздать эту форму. Самый простой способ сделать это-сначала экспортировать форму в текстовый файл с помощью приложения недокументированной функции.SaveAsText. Затем вы удаляете форму из своей базы данных и повторно загружаете ее Приложение.LoadFromText.