БД связанного доступа "запись была изменена другим пользователем" - PullRequest
14 голосов
/ 10 июня 2009

Я поддерживаю многопользовательскую БД Access 2000, связанную с базой данных MSSQL2000, не написанную мной.

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

В форме «Клиент» есть поле «Customer_ID», которое по умолчанию должно получить следующий доступный идентификатор клиента, но у пользователя есть возможность переопределить этот выбор существующим идентификатором клиента.

Теперь поле Customer_ID не является PK таблицы Customer. Это также не уникально.

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

Если пользователь создает новый билет, Access выполняет быстрый поиск следующего доступного идентификатора клиента и заполняет его. Но запись не сохраняется. Очевидно, проблема - редактирование двумя пользователями должно отслеживать работу друг друга, чтобы они не дублировали идентификатор клиента.

Итак, я хочу изменить кнопку «Новая запись», чтобы она сохраняла заявку сразу после создания новой.

Проблема в том, что, когда я тестирую изменение, я получаю сообщение «Эта запись была изменена другим пользователем, так как вы начали ее редактировать».

Определенно нет других пользователей в БД. «Другой пользователь» был, вероятно, моим принудительным сохранением.

Есть идеи?

Ответы [ 9 ]

43 голосов
/ 11 июня 2009

Посмотрите на вашу связанную таблицу в SQL Server 2000. Есть ли в ней поле, содержащее тип данных бит? Access выдаст вам это сообщение об ошибке в сценарии со связанной таблицей, если у вас есть битовое поле , которое не имеет значения по умолчанию .

Возможно, это не то, что не так в вашем случае, но я испытал то же самое в базе данных Access 2007 и отслеживал проблему в битовом поле без значения по умолчанию.

10 голосов
/ 10 июня 2009

Я видел такое поведение раньше, и это исправило это для меня:

Попробуйте добавить поле TimeStamp в таблицу (просто добавьте это поле и обновите связанные таблицы. Вам не нужно заполнять это поле какими-либо данными).

7 голосов
/ 10 июня 2009

Ошибка, которую вы получаете, обычно возникает, когда:

  1. вы редактируете запись в форме, а форма грязная (т.е. изменения не сохранены),

И

  1. вы запускаете код, который использует DAO или ADO для запуска SQL для обновления той же записи.

Для Jet это два «пользователя», потому что это две разные операции редактирования. Базовая таблица была обновлена ​​обновлением SQL, а данные в буфере форм устарели.

Обычным решением является принудительное сохранение перед запуском обновления SQL:

  If Me.Dirty Then
     Me.Dirty = False
  End If
  [run your SQL update here]

Но если вы используете формы для редактирования записи, вам следует делать все обновления в форме, а не прибегать к SQL для обновления.

Ситуацию, которую вы описываете с генерацией собственной последовательности, следует делать следующим образом:

  1. пользователь нажимает кнопку NEW RECORD.

  2. рассчитать следующее значение последовательности и сохранить его в переменной.

  3. вставить новую запись с этим значением последовательности через SQL INSERT.

* 1 034 * 4а. если ваша форма связана со всеми записями в таблице, запросите форму редактирования данных (при условии, что кнопка NEW RECORD находится на форме, где пользователи редактируют данные), и используйте навигацию по закладкам, чтобы перейти к новой записи со значением последовательности, которое вы сохранили в переменной на шаге 2. * * +1036 4b. Если ваша форма не связана со всеми записями (как это не должно быть, если это хорошо спроектированная база данных), вы просто изменили бы источник записей формы, чтобы загрузить только новую запись.

Другая альтернатива - избегать SQL INSERT и запроса (или сбрасывать источник записей) и просто добавлять новую запись в существующую форму, устанавливать для поля последовательности новое значение и немедленно сохранять запись.

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

5 голосов
/ 28 марта 2011

Это старый вопрос, с которым я столкнулся в Google, поэтому я отправлю свой ответ.

В драйвере ODBC обязательно включите управление версиями строк. Если таблица уже находится в Access, вам придется удалить ее и повторно связать с исходной таблицей.

Вы должны быть в состоянии определить, включено ли управление версиями строк, поскольку Access должен добавить в таблицу столбец с именем xmin.

.
1 голос
/ 10 июня 2009

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

0 голосов
/ 14 октября 2015

Эта ошибка также может быть вызвана, если таблица SQL Server содержит столбец datetime2 (в моем случае со значением по умолчанию sysdatetime ()). Изменение типа данных обратно на дату и время по умолчанию current_timestamp останавливает ошибку.

0 голосов
/ 27 января 2015

Я только что натолкнулся на другую ситуацию, которая порождает эту ошибку. В таблице mysql у меня было два столбца даты, которые изначально имели значение по умолчанию «0000-00-00». Позже он был изменен на значение по умолчанию NULL, но многие строки сохранили значение «0000-00-00». Мне пришлось вручную сбросить значения в NULL, чтобы остановить ошибку.

Потребовалось много времени, чтобы выяснить, что вызвало ошибку, HTH кто-то еще.

0 голосов
/ 17 марта 2014

Наши проблемы заключались в том, что клиентский интерфейс доступа пытался сохранить int (да / нет) в поле бита mssql (0/1). Изменение базы данных mssql на поля int работало как чудо.

0 голосов
/ 18 июня 2013

У меня тоже была такая же проблема. Я пытался обновить в таблице с помощью Spring MVC и Hibernate. В моем случае столбец версии в таблице содержит значение больше 1 (т.е. 3), однако информация об обновлении в моем запросе на обновление имела значение версии 1.

...