База данных связанного доступа “запись была изменена другим пользователем”

StackOverflow https://stackoverflow.com/questions/973076

  •  13-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

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

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

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

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

Есть какие-нибудь идеи?

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

И

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

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

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

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

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

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

  1. пользователь нажимает кнопку СОЗДАТЬ ЗАПИСЬ.

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

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

4а.если ваша форма привязана ко всем записям в таблице, запросите форму редактирования данных (при условии, что кнопка СОЗДАТЬ ЗАПИСЬ находится на форме, где пользователи редактируют данные) и используйте навигацию по закладкам для перехода к новой записи со значением последовательности, которое вы сохранили в переменной на шаге 2.

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top