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

StackOverflow https://stackoverflow.com/questions/1575487

Вопрос

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

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

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

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

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

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

МТИА

Это было полезно?

Решение 6

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

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

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

Другие советы

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

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

  2. в настройках VBE включите ТРЕБУТЬ ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ.

  3. в VBE настройте панель инструментов так, чтобы кнопка «Скомпилировать» была легкодоступна (она находится в меню «Отладка»).Я также рекомендую добавить кнопку CALL STACK (из меню VIEW), так как она удобна для отладки ошибок в режиме перерыва.Цель здесь — максимально упростить отладку и компиляцию.

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

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

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

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

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

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

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

Итак, спустя два года, выполняя большую часть работы с приложениями 2007 года, а также с более старыми приложениями 2003 года (и даже 97 года), я обнаружил, что 2007 год менее подвержен действительно неприятным сбоям, чем 2003 год, где определения объектов Access (формы и отчеты, особенно) могут быть легко повреждены.

Тем не менее, я по-прежнему неукоснительно следую предложениям 1-6 (выше) Дэвида-В-Фентона, а также использую Application.SaveAsText (см. предложение Тони Тэйвса и ссылку выше).

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

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

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

О боже.

Я много лет работал в магазине, который использовал Access в качестве платформы.В конечном итоге приложение стало настолько большим, что начало сталкиваться с ограничением внутренней памяти 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 может быть слишком большим, хотя это дало вам сообщение, когда вы приступили к созданию MDE. АСС2000:Сообщение об ошибке «Microsoft Access не удалось создать базу данных MDE»

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top