2013-06-24 4 views
9

У нас есть специальная программа, написанная в Access, в которой есть странные сбои. Мы добавили обработку ошибок, которая регистрирует и отправляет сообщения о любых сбоях, которые происходят внутри нашего собственного кода, и это позволило нам исправить большинство ошибок, которые мы сгенерировали, но иногда сбои происходят за пределами нашего кода.Как диагностировать сбои доступа MS

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

Есть ли способ поймать и диагностировать сбои уровня программы внутри доступа MS?
окна просмотра событий показывает только следующее: имя

Ошибка приложения: MSACCESS.EXE, версия: 15.0.4454.1501, штамп времени: 0x50a35ef4 Faulting имя модуля: MSACCESS.EXE, версия: 15.0.4454.1501, штамп времени : 0x50a35ef4 исключения код: 0xc0000005 Fault смещения: 0x00116452 Сбойного идентификатора процесса: 0x1398 Сбойного время запуска приложение: 0x01ce6e665043d8be Faulting приложения путь: C: \ Program Files (x86) \ Microsoft Office \ Office15 \ MSACCESS.EXE Faulting модуля путь: C: \ Program Files (x86) \ Microsoft Office \ Office15 \ MSACCESS.EXE Идентификатор отчета: 6cfcb0eb-da62-11e2-89 66-842b2b86f028

ответ

5

Это старая тема, но она показалась одним из лучших результатов в Google, поэтому я подумал, что дам ответ. Какие шаги вы можете предпринять, когда получите «Доступ столкнулся с проблемой и нужно закрыть». Обычно в журнале событий вы увидите:

Faulting application name: MSACCESS.EXE, version: 15.0.4869.1000, time stamp: 0x57e12b41 
Faulting module name: MSACCESS.EXE, version: 15.0.4869.1000, time stamp: 0x57e12b41 
Exception code: 0xc0000005 

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

Decompile Database

Вы указали, что политика декомпилировать каждый выпуск. Хорошая политика - но делайте это явно после КАЖДОГО времени, когда вы получите сообщение об ошибке. Причина в том, что вы можете устранить основную проблему, но не замечаете из-за поврежденного контейнера.

  • Я создаю ярлык, который загружает базу данных с помощью переключателя «/ decompile».
  • удерживайте нажатой клавишу shift при двойном нажатии на этот ярлык, чтобы любые автопрограммы пропускались, и вы переходите прямо в навигационное окно.
  • После загрузки базы данных вам нужно будет нажать кнопку «Компакт» и «Восстановить». При перезагрузке базы данных снова удерживайте нажатой клавишу.
  • Теперь перейдите и скомпилируйте код и сохраните. Это процесс, который я использую для декомпилирования.

Тест памяти компьютера

Особенно, если аварии не ограничивается одной или двумя машинами - это сделать.
Проверьте средства просмотра событий. Есть ли еще несколько сообщений «Ошибка», описывающих сбой приложения, а модуль сбоев отличается? Если это так, то хорошо, что если это не коррумпированные окна, вы смотрите на проблему с памятью.

Я уверен, что есть много замечательных тестеров памяти, но я рекомендую вам использовать надлежащий тест, который поймает сброшенные бит. MemTest86 - это старое, но приятное. Существует current version и некоторые одинаково хорошие forks.

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

Удалить двоичные данные из формы

Иногда аварии происходят в одной форме или отчете. Если это поврежденные двоичные данные, то сбои должны происходить на разных компьютерах с разными пользователями. Если это так, выполните следующие шаги. (Только для продвинутых пользователей)

  1. В ближайшем окне сохранить объект как текст.

    Application.SaveAsText acForm, "MyForm", CurrentProject.Path & "\ MyForm.txt"

  2. Переименовать элемент оригинальной формы (например, переименовать MyForm_Bak)

  3. Откройте экспортированный файл в блокноте
  4. Удалить строку "Checksum =" (должно быть в строке 3)
  5. Очистить двоичные данные
    • аблюдая файл.
    • Будут линии, начинающиеся с «Параметр = Начало» и имеющие строки закодированных двоичных данных, заканчивающиеся линией, состоящей из «Конец»
    • Когда вы найдете одну из этих строк, вам необходимо (включительно) удалите все строки с начала до конца.
    • Параметры вы должны удалить являются: NameMap, PrtMip, PrtDevMode, PrtDevNames, PrtDevModeW, PrtDevNamesW
    • Все эти блоки должны отображаться перед определениями контроля формы
  6. В то время как у вас есть файл открыт, прокрутите остальную часть файла и искать все, что бросается в глаза, особенно в коде модуля VBA внизу.
  7. Сохраните файл
  8. В Access, на немедленном окне, загрузите форму обратно в

    Application.LoadFromText acForm, "MyForm", CurrentProject.Path & "\ MyForm.txt"

  9. Декомпилировать/Компактный ремонт/перекомпиляция

  10. Открыть форму и, надеюсь, все будет работать лучше.

Избавиться от «OLE Object» полей

Если у вас есть изображения или другие данные, хранящиеся в самом Access, то вы должны найти лучший подход. Когда данные OLE хранятся, они хранятся в соответствии с программным обеспечением (и версией программного обеспечения) на компьютере, который его хранит. Когда другой компьютер переходит к отображению данных OLE Object в форме, но не имеет точного программного обеспечения/версии, установленной - вы нередко заканчиваете сбой.

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

Перестроить всю базу данных

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

Как и в случае удаления двоичных данных, вы собираетесь восстановить базу данных с нуля. К тому времени, как я достиг этого шага, я нахожусь в полностью параноидальном режиме. Возможно, это немного ритуально, но я делаю все тщательно, без каких-либо коротких сокращений и большой осторожности, чтобы не «сохранять» коррупцию прямым копированием или импортом/экспортом. Как моя последняя позиция, я не думаю, что это никогда не решило проблему. К счастью, мне не приходилось делать это со времен Access 2000.

  • Создайте новый контейнер базы данных доступа.
  • Не используйте функции импорта/экспорта
  • Таблицы:
    • Для каждой таблицы в старом контейнере доступа, создать новую таблицу в новый контейнер. С точки зрения дизайна скопируйте/вставьте определения полей.
    • Экспортируйте старые данные в XML или CSV, а затем импортируйте их.
  • запросов:
    • Перейти в поле зрения SQL в исходном запросе, копировать и вставлять текст SQL в запросе новой базы данных.
  • Формы/Отчеты:
    • использовать приложение.SaveAsText функция экспортировать формы/отчеты
    • Газа двоичные данные из форм и обзор
    • Используйте функцию Application.LoadFromText реимпортировать их
  • Макросы
    • Реконструировать макрокоманд.
    • В Access 2007 и новее с новой системой Macro вы можете просто открыть макрос, Выбрать все (Control + A) и вставить в пустой документ «Блокнот». Копирование снова из блокнота и вставить в пустой макрос в новый контейнер доступа
  • Модули
    • Выберите весь код (Ctrl + A) и вставить (Ctrl + V) в новый контейнер базы данных
    макросы
  • данных
    • Я не должен был сделать это, так как макросы данных вышли, но вы должны использовать функции SaveAsText/LoadFromText экспортировать макросы данных от таблиц.

Когда все сказано и сделано - вы должны иметь очень чистый контейнер базы данных.

удалить другие переменные из теста

Сеть Коррупция

Не загружайте клиента от сети. Поместите его на локальный диск и запустите его оттуда.

Корпоративный Строит

Если вы находитесь в корпоративной среде, которая использует «компьютер строит» и не имели никакого успеха с Декомпиляция, тестирования памяти, и вскрышных двоичных данных - то отказываются от дальнейших испытаний, пока не найдете ИТ-команда может предоставить пользователю тестовую машину, на которой установлены только Windows, Office и Service Pack. Обычно я предпочитаю делать установку самостоятельно, поэтому я знаю, что могу доверять ей. Все программное обеспечение и обновления должны быть установлены вручную без использования автоматической установки. Не устанавливайте антивирус на этом компьютере.

У меня были отделы ИТ, отказывающиеся от этого из чистого F.U.D. и необоснованность - если это то, с чем вы столкнулись, тогда вымойте руки в этом вопросе в контексте «Помогите мне помочь вам».

Bad Мощность

Как уже упоминалось в разделе памяти - мощность fluctations может вызвать ошибки компьютера. Если база данных находится в промышленном здании, а затем попробуйте получить питание от кондиционера или ИБП, который обеспечивает чистую мощность (от батареи, а не от основного, проходящего через металлооксидный варистор)

Также проверьте кабель питания, который подключается к шине питания или розетке. Убедитесь, что характеристики манометра и напряжения достаточны. Я говорю это, потому что ИТ-отделы часто оставляют силовые кабели, подключенные к станции, и просто удаляют машину.После многих лет они используют более мощные источники питания, но не отключили кабель. Это имеет значение. Если вы сомневаетесь, принесите новый, более толстый кабель.

3

Каждая функция в каждой форме в каждой базе данных Access должен иметь поток, который выглядит следующим образом:

Private Sub btnMyButton_Click() 
Dim MyVar as String 
On Error GoTo ErrorHappened 

'Do some stuff here... 

ExitNow: 
    Exit Sub 

ErrorHappened: 
    MsgBox Err.Description 
    Resume ExitNow 
End Sub 

В разделе ErrorHappened, вы можете иметь его писать в таблицу, которая отслеживает ошибок. Если вы измените все свои Subs и Functions таким образом, вы сможете уловить каждую проблему, имеющуюся в вашей базе данных. Возможно, напишите номер Err.Number, а также Err.Description.

+0

Мы используем ловушку ошибок очень похоже на это - некоторые ошибки, похоже, происходят за пределами нашего кода и в коде Microsoft, поэтому он пропускает нашу обработку ошибок. Я пытаюсь определить эффективный способ решения сбоев, которые происходят за пределами нашего кода (они все равно могут быть вызваны нашим кодом, но наши полностью завершены и _then_ происходит сбой) –

+1

Скомпилирован ли ваш код? Вы пытались декомпилировать его с помощью ключа -decompile, а затем перекомпилировать его? –

+0

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

1

Для кого-то, кто натыкается на эту тему в Google вот еще несколько причин для случайных аварий доступа:

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

  • Если у вас есть «_Enter» события на полях на материнской форме это может привести к Access идти в бесконечный цикл, неоднократно стреляя эти события. Это произошло, когда я был в подчиненной форме и нажал кнопку в родительской форме. Вместо этого я заменил их событиями «_GotFocus», которые исправили проблему.

  • Не ссылайтесь на подформу в onLoad даже в родительской форме. Этот случай был случайным, форма загрузилась бы нормально, а затем в следующий раз, когда вы вошли в ту же форму, с той же записью, это приведет к сбою доступа. Поэтому я удалил все ссылки на подформу в событии onLoad родительской формы, и теперь она работает нормально. Я особенно заметил это, когда мое подключение к Интернету было медленным, оказалось, что основная форма загружалась до подформы, поэтому, когда она ссылалась на нее, она не загружалась и поэтому вызывала всевозможные проблемы с Access, которые неизменно заканчивались случайным сбоем доступа.

Смежные вопросы