Редактирование записей в Access/SQL (запись конфликтов)
возникла проблема после того, как SQL-база данных, которую я использовал, была перенесена на новый сервер. Теперь, пытаясь отредактировать запись в Access (форма или таблица), в ней говорится: WRITE CONFLICT: This record has been changed by another user since you started editing it...
Есть ли какие-то неочевидные причины для этого. Больше никто не использует сервер, я отключил триггеры в таблице. Я только что нашел, что это что-то связано с NULL как записи, у которых нет ни одного, но некоторые строки, у которых есть NULL, нет. Это может быть связано с индексами? Если это актуально, я недавно начал загрузку BULK ежедневно, вместо того, чтобы делать это по одному, используя INSERT INTO из Access.
Ответы
Ответ 1
Возможные проблемы:
1 Параллельное редактирование
Причиной может быть то, что рассматриваемая запись была открыта в форме, которую вы редактируете. Если вы измените запись программным способом во время сеанса редактирования, а затем попытаетесь закрыть форму (и, таким образом, попытаетесь сохранить запись), Access скажет, что запись была изменена кем-то другим.
Сохраните форму перед программным изменением записи.
В виде:
'This saves the form current record
Me.Dirty = False
'Now, make changes to the record programmatically
2 Отсутствует первичный ключ или timestamp
Убедитесь, что таблица SQL-Server имеет первичный ключ, а также столбец отметки времени.
Столбец отметки времени помогает Access определить, была ли запись отредактирована с момента ее последнего выбора. Access делает это путем проверки всех полей, если timestamp недоступна. Возможно, это не очень хорошо работает с нулевыми записями, если столбец отметок времени отсутствует (см. 3 вопроса "Пустые биты").
Отметка времени на самом деле хранит номер версии строки, а не время.
Не забудьте обновить ссылку на таблицу в access после добавления столбца timestamp, иначе Access не увидит его. (Примечание. Microsoft Upsizing Wizard создает столбцы меток времени при преобразовании таблиц Access в таблицы SQL-Server.)
3 пустых вопроса
Согласно @AlbertD.Kallal, это может быть проблема с нулевыми битами, описанная здесь: KB280730. Если вы используете битовые поля, установите для них значение по умолчанию 0
и замените все NULL, введенные ранее, на 0
. Я обычно использую BIT DEFAULT 0 NOT NULL
для логических полей, так как это наиболее близко соответствует идее логического поля.
В статье базы знаний говорится, что нужно использовать *.adp вместо *.mdb; однако Microsoft прекратила поддержку проектов доступа к данным (ADP) в Access 2013.
Ответ 2
Если бы эта проблема была такой же, как исходный плакат. Даже при прямом редактировании без формы. Проблема заключается в битовых полях. Если ваше поле Null, оно преобразует Null в 0 при доступе к записи, то вы вносите изменения, которые на этот раз являются вторым изменением. Таким образом, 2 меняются конфликты. Я следовал за предложением Оливье:
"Убедитесь, что в таблице есть первичный ключ, а также столбец timestamp."
И он решил проблему.
Ответ 3
Я видел аналогичную ситуацию с MS Access 2003 (и ранее), когда был связан с MS SQL Sever 2000 (и ранее). В моем случае я обнаружил, что проблема является битовыми полями в таблицах базы данных MS SQL Server - битовые поля не допускают нулевые значения. Когда я добавлю запись в таблицу, связанную через MS Access 2003 в окне базы данных, будет возвращена ошибка, если я специально не установил бит в значение True или False. Чтобы исправить это, я сменил любые базы данных MS SQL Server, чтобы любое поле бит по умолчанию было либо 0, либо 1. После этого я смог добавлять/редактировать данные в связанную таблицу через MS Access.
Ответ 4
Я нашел проблему из-за конфликта между битовыми полями Jet/Access и SQL Server.
Описан здесь под ловушкой №4
https://blogs.office.com/2012/02/17/five-common-pitfalls-when-upgrading-access-to-sql-server/
Я написал SQL script, чтобы изменить все битовые поля на NOT NULL и предоставить значение по умолчанию - ноль в моем случае.
Просто выполните это в SQL Server Management Studio и вставьте результаты в новое окно запроса и запустите их - вряд ли стоит поместить это в курсор и выполнить его.
SELECT
'UPDATE [' + o.name + '] SET [' + c.name + '] = ISNULL([' + c.name + '], 0);' +
'ALTER TABLE [' + o.name + '] ALTER COLUMN [' + c.name + '] BIT NOT NULL;' +
'ALTER TABLE [' + o.name + '] ADD CONSTRAINT [DF_' + o.name + '_' + c.name + '] DEFAULT ((0)) FOR [' + c.name + ']'
FROM
sys.columns c
INNER JOIN sys.objects o
ON o.object_id = c.object_id
WHERE
c.system_type_id = 104
AND o.is_ms_shipped = 0;
Ответ 5
Это ошибка с Microsoft
Чтобы обойти эту проблему, используйте один из следующих способов:
-
Обновить форму, основанную на представлении с несколькими таблицами При первом появлении сообщения об ошибке, упоминаемого в разделе "Проблема", вы должны щелкнуть "Копировать в буфер обмена" или
Отменить изменения в диалоговом окне "Контекст записи". Чтобы избежать повторения
появление сообщения об ошибке, которое упоминается в "Симптомах"
раздел, вы должны обновить набор записей в форме, прежде чем редактировать
та же самая запись снова. Заметки Чтобы обновить форму в Access 2003 или Access 2002, нажмите "Обновить" в меню "Записи". Чтобы обновить форму в Access 2007, нажмите "Обновить все" в группе "Записи" на вкладке "Главная".
-
Используйте основную форму со связанной подформой Чтобы избежать повторного появления сообщения об ошибке, упомянутого в разделе "Проблема", вы можете использовать основную форму с помощью
связанная субформация для ввода данных в соответствующие таблицы. Вы можете ввести
записи в обе таблицы из одного места без использования формы, которая
основанный на представлении с несколькими таблицами. Чтобы создать основную форму со связанной структурой, выполните следующие действия:
Создайте новую форму, основанную на связанной (дочерней) таблице, которая используется в представлении с несколькими таблицами. Включить обязательные поля
на форме. Сохраните форму и закройте форму. Создайте новую форму, основанную на первичной таблице, которая используется в представлении с несколькими таблицами. Включите обязательные поля на странице
форма. В окне базы данных добавьте форму, сохраненную на шаге 2, в основную форму.
Это создает подчиненную форму. Задайте свойство Link Child Fields и свойство Link Master Fields подформы для имени поля или полей, которые находятся на
используется для связывания таблиц.
Методы работы, взятые из поддержка microsoft
Ответ 6
Я столкнулся с двумя причинами, описанными выше: Прямое изменение данных в таблице, которая в настоящее время привязана к форме AND, которая имеет поле типа "бит" в SQL Server, которое не имеет значения по умолчанию, установленного в "0" ( ноль).
Единственный способ, которым я смог обойти последнюю проблему, - добавить значение нуля по умолчанию в поле бит И запустить запрос на обновление, чтобы установить все текущие значения в ноль.
Чтобы обойти прежнюю ошибку, я должен был быть изобретательным. Иногда я могу изменить порядок операторов VBA и переместить Refresh или Requery в другое место, тем самым предотвращая сообщение об ошибке. Однако в большинстве случаев я делаю DIM переменную String в подпрограмме, где я вызываю обновление прямой таблицы. Прежде чем я вызову обновление, я установил эту переменную String в значение Recordsource за связанной формой, таким образом, захватив точный оператор SQL, используемый в то время. Затем я устанавливаю форму Recordource на пустую строку ( "), чтобы отключить ее от данных. Затем я выполняю обновление данных. Затем я устанавливаю форму Recordource обратно на значение, сохраненное в переменной String, восстанавливая привязку и позволяя ей получать новые значения в таблице. Если в этой форме есть одна или несколько подформ, то поля" Ссылка "должны обрабатываться аналогично документу" Источник записи ". Если для параметра" Источник записи" задана пустая строка, вы можете увидеть #Name в полях, которые теперь не связаны. То, что я делаю, просто устанавливает для свойства Visible значение False на максимально возможном уровне (подробный раздел, подформат и т.д.) В течение времени, когда источник записей пуст, скрывая значения #Name от пользователя. Установка источника записей в пустую строку - это мое решение, когда изменение кода не может быть найдено. Мне интересно, однако, если мои дизайнерские навыки отсутствуют, и есть способ полностью избежать проблемы вообще?
Последняя мысль об адресе сообщения об ошибке: вместо вызова подпрограммы для непосредственного обновления данных в таблице таблицы я нахожу способ обновить данные через форму вместо этого, добавив связанный элемент управления в форму и обновление данные в этом, чтобы данные формы и данные таблицы не переставали синхронизироваться.
Ответ 7
Чтобы справиться с этой проблемой. Я создал VBA для изменения другого поля в той же строке. Поэтому я создал отдельное поле, которое добавляет 1 к содержимому, когда я пытаюсь закрыть форму. Это решило проблему.
Ответ 8
Я рассматривал эту проблему с таблицами MS Access, связанными с таблицами MS SQL несколько раз. Первоначальный ответ на постер был чрезвычайно полезен и, по сути, был источником многих моих проблем.
Я также столкнулся с этой проблемой, когда я случайно добавил поле бит с пробелом в поле namename... yeah....
Я запустил alter table tablename add [fieldname] бит по умолчанию 0. я решение, которое я нашел, должно было удалить это поле и не иметь пробела в имени.
Ответ 9
У меня была эта проблема, и я понял, что это вызвано добавлением нового битового поля в существующую таблицу. Я удалил новое поле, и все вернулось к работе.
Ответ 10
Если вы используете связанные таблицы, убедитесь, что вы обновили их и повторите попытку, прежде чем делать что-либо еще.
Я думал, что обновил их, но не сделал, выяснилось, что кто-то обновил проверку формы и таблицы SQL, чтобы разрешить 150 символов, но не обновил связанную таблицу, следовательно, доступ только к разрешению 50 char - Boom Write конфликт
Не уверен, что это самая подходящая ошибка для сценария, но, к сожалению, большинство интересных вопросов никогда не помечены соответствующим образом в любом программном обеспечении Microsoft!
Ответ 11
Я использую этот обходной путь, и он работал для меня: Front end: Ms Access Backend: Mysql
В событии "До обновления" данного поля:
Private Sub tbl_comuna_id_comuna_BeforeUpdate(Cancel As Integer)
If Me.tbl_comuna_id_comuna.OldValue = Me.tbl_comuna_id_comuna.Value Then
Cancel = True
Undo
End If
End Sub
Ответ 12
У меня только что были очень серьезные проблемы с записью (32-битный Acc2013, SQL Srv2017 expr) с довольно "тяжелой" Split-формой. Для меня - наконец-то - было решение избавиться от проблем с конфликтом записи, чтобы просто
УСТАНОВИТЕ таблицу данных AcSplitForm ТОЛЬКО ДЛЯ ЧТЕНИЯ !!! (Я понятия не имею, почему это было чтение-запись в любом случае, я должен был установить его по ошибке...)
Это почти стоило мне целую неделю, чтобы это выяснить.
Ответ 13
Я получал такое же сообщение об ошибке.
Id Столбец в таблице базы данных был установлен в BigInt, изменив его на Int, разрешил проблему.