Как исправить возможные повреждения БД? - PullRequest
4 голосов
/ 30 октября 2008

Я нахожусь на клиенте, делающем некоторые быстрые исправления к их приложению доступа. Это было какое-то время у меня был доступ с доступом, но я быстро поправляюсь. Однако я обнаружил интересную проблему:

В некоторых отчетах появляется ошибка «Запись удалена». Я проверил отчеты, и кажется, что есть проблема с одной таблицей. Открывая эту таблицу, я нахожу запись, в которой все столбцы помечены как «#deleted». Итак, очевидно, этот ряд кажется виновником. Однако, когда я пытаюсь удалить эту строку, на самом деле ничего не происходит. Если я снова открою таблицу, строка все еще существует.

Есть ли коррупция в БД? Как я могу удалить эту запись навсегда?

Редактировать: Это версия MS2000

Решение: Просто сжатие / ремонт не сработали. Вместо этого я преобразовал базу данных в формат файла 2003, что и помогло. Я отметил первый ответ, предлагающий сжатие / восстановление, так как он указал мне правильное направление. Спасибо!

Ответы [ 5 ]

4 голосов
/ 30 октября 2008

Tony Toews, Access MVP, предлагает исчерпывающее руководство по борьбе с коррупцией:

Часто задаваемые вопросы о поврежденных базах данных Microsoft Access

  • Некоторые симптомы коррупции
  • Определение рабочей станции, которая вызвала повреждение
  • Коррупция вызывает
  • Чтобы получить ваши данные

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

4 голосов
/ 30 октября 2008

Вы пробовали встроенный в Access компактный / ремонтный инструмент? Это должно сбросить удаленные записи из базы данных.

Точное местоположение зависит от используемой версии Access, но в Access 2003 оно находится в разделе Инструменты> Утилиты базы данных> Сжать и восстановить базу данных. В некоторых более ранних версиях Access было два отдельных инструмента - один для компактных, другой для ремонта - но доступ к ним осуществлялся из аналогичного места. Если они отличаются в зависимости от версии клиента, вам нужно запустить оба.

Это должна быть неразрушающая операция, но было бы лучше проверить это на копии файла MDB (извиняюсь за очевидное).

3 голосов
/ 31 октября 2008

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

Вместо этого используйте несвязанное текстовое поле и в событии OnCurrent формы назначьте текущие данные из базового источника записей формы:

  Me!txtMyMemo = Me!MyMemo

Чтобы сохранить изменения в несвязанном элементе управления, используйте событие AfterUpdate элемента управления:

  Me!MyMemo = Me!txtMyMemo
  Me.Dirty = False        ' save the whole record

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

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

3 голосов
/ 30 октября 2008

Вы также можете попробовать это Утилита командной строки

// * 1005 Энди *

2 голосов
/ 30 октября 2008

Помимо опций, уже опубликованных выше, я также использовал другой простой метод: просто создайте новый файл MDB и импортируйте все объекты из поврежденного. Не забудьте получить системные и / или скрытые объекты, когда вы идете этим путем.

...