Ошибка при сохранении измененной строки, если изменение было в поле типа "Напоминание"

У нас есть Access-db со связанными (odbc) таблицами на sql-сервере. Иногда возникает редкая проблема с одним столбцом определенной строки: больше никаких изменений в поле типа memo невозможно. Изменения в других столбцах этой конкретной строки сохраняются как обычно. Сообщение об ошибке выглядит примерно так: другое приложение изменило строку, и поэтому обновление было отменено.

в чем может быть причина, что можно сделать, чтобы предотвратить такое поведение?

Мир Лед

Обновить:

MDB окончательно не поврежден. Внутри находятся только odbc-соединения, мы используем его только для чтения. Проблема должна быть между реактивным двигателем и драйвером odbc, соответствующим sql-серверу, это то, что я думаю.

мир

лед

1 ответ

Решение

Если бы ваши данные хранились в бэкэнде Jet/ACE, я бы сказал, что у вас скорее всего есть поврежденный указатель памятки. Поскольку ваши данные находятся в SQL Server и доступны через ODBC, это не может быть ответом. Но поскольку к этой дискуссии могут прийти другие, которые сталкиваются с проблемой с серверной частью Jet/ACE, может быть полезно следующее:

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

Некоторые ссылки от Tony Toews (лучший источник для этого):

Общий справочный источник о коррупции в Jet/ACE

Симптомы коррупции

Во втором случае найдите 3197, который, вероятно, является номером ошибки проблемы, с которой вы столкнулись. Там есть ссылка, которая объясняет, как ее устранить.

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

  1. Я знаю, что вы не используете Access, но для форм Access одно из решений состоит в том, чтобы избегать связанных полей памятки и вместо этого редактировать их в несвязанных текстовых полях. В событии OnCurrent формы Access необходимо скопировать данные заметки из коллекции полей формы в несвязанное текстовое поле для нее, а в событии AfterUpdate текстового поля сохранить ее обратно в базовый набор записей формы.

  2. для всех приложений, Доступ или нет, помещение заметок в отдельную таблицу отделяет указатель поля заметки от остальной части данных. Если у вас есть одна заметка, это может быть таблица 1:1, а если у вас есть несколько заметок, у вас будет 1:N, а в таблице заметок должно быть поле для указания типа заметки. С этой структурой, основная запись не должна быть удалена и воссоздана, чтобы исправить поврежденный указатель - все, что вам нужно сделать, это удалить поврежденную запись в таблице memo.

Другие вопросы по тегам