Ошибка при сохранении измененной строки, если изменение было в поле типа «Заметка» - PullRequest
0 голосов
/ 26 октября 2009

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

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

Мир Ice

Обновление:

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

Мир

Ice

1 Ответ

1 голос
/ 31 октября 2009

Если бы ваши данные хранились в бэкэнде 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.

...