Запись была изменена другим пользователем при попытке публикации или редактирования

Я разрабатываю приложение, используя Delphi 7 и Sql Server Express 2008 R2, я использую BDE для подключения Sql Server через ODBC, и используется SQL Native Client. для водителя.

В некоторых конкретных формах компонент таблицы поднимает EDBEngineError «Запись была изменена другим пользователем», я просто пытаюсь добавить данные, та же проблема возникает, когда table.cancel, table.post, table.edit.....

За несколько дней до того, как я сменил драйвер с SQL Server на Sql Native Client, из-за того, что у сервера sql возникла проблема с «соединением есть набор результатов для другого hstmt», я изменил его. для собственного клиента SQL, из этого я встретил эту ошибку «Запись была изменена другим пользователем».

Пожалуйста, помогите


person bejarun    schedule 30.01.2012    source источник
comment
вам нужно найти способ увидеть сгенерированный SQL, чтобы найти основную причину, я рекомендую скомпилировать с помощью Use Debug DCU и перейти к исходному коду BDE, пока вы не увидите сгенерированную строку SQL. Недавно я решил аналогичную проблему с dbExpress.   -  person mjn    schedule 30.01.2012


Ответы (2)


  1. BDE давно не обновляется. И SQL Native Client регулярно обновляется. Возможно, вы столкнулись с несовместимостью BDE и SQLNC v 10.5.
  2. «Запись была изменена другим пользователем» означает, что API вернул ‹> 1 из обновленных записей, например 0 записей. В большинстве случаев это не совсем так, что какой-то пользователь изменил запись. Количество обновленных записей возвращается в виде отдельного сообщения, поэтому, если соединение занято другими сообщениями, оно может вернуть 0. Если в ваших таблицах есть триггеры, попробуйте добавить SET NOCOUNT ON поверх триггера.
  3. «Соединение занято набором результатов для другого hstmt» означает, что вы не получили все записи из активного набора результатов. Вы можете попробовать получить все записи.
  4. Чтобы избежать всех этих ошибок, рассмотрите возможность перехода на dbExpress или стороннюю библиотеку, например AnyDAC.

Дополнение к (2): Другая классическая причина "Запись была изменена другим пользователем". Фраза WHERE включает в себя поле и соответствующий параметр, которые не совпадают по точности (например, теряется точность на стороне клиента), имеют разные форматы (например, несовместимые наборы символов) и т. д. Необходимо проверить команду SQL и параметр значения, отправленные на SQL Server с помощью SQL Profiler.

person da-soft    schedule 30.01.2012
comment
dbExpress все еще имеет свои проблемы, которые могут вызывать ту же ошибку - например, отсутствие поддержки миллисекунд (с InterBase) - person mjn; 30.01.2012
comment
спасибо за ответ, перед этим хочу сказать одно,, - person bejarun; 31.01.2012
comment
спасибо за ваш ответ, сначала я разработал это приложение, используя Paradox 'db, после этого я перешел на сервер sql, у меня есть 100 компонентов таблиц в модуле данных, поэтому нелегко изменить все это на другую композицию 3-й части, создать Источники данных OBDC и подключить их через BDE, и эта «запись, заблокированная другим пользователем, ошибка будет происходить только во временных таблицах (имя таблицы начинается с «#»), я также пытался использовать драйвер sqlserver, я не могу найти, какой запрос частично извлек данные, поэтому я конвертирую в sqlnative клиент после того, как я изменил эту «ошибку hstmt», но появилась ошибка блокировки записи, - person bejarun; 31.01.2012
comment
Хороший список от @da-soft.. У нас была такая же проблема.. И в нашем случае мы обнаружили, что один из триггеров на определенной таблице выполнял оператор «PRINT». Мы закомментировали это, и это устранило ошибку. - person NamoRamana; 13.10.2020

Друг мой, тебе следует подумать об обновлении своих средств разработки. Для решения этой проблемы вам действительно следует работать с пакетом компонентов ZEOS для Delphi. Он может подключаться ко многим типам баз данных, включая Firebird, MySQL, Access и SQL Server. Все, что вам нужно сделать, это поместить dll базы данных, которую вы используете, в каталог вашего проекта и папку bin delphi (если на целевом компьютере нет менеджера баз данных). Затем вы позволяете серверу базы данных позаботиться о транзакциях. Если вам нужны подробности, просто дайте мне сигнал.

person Please_Dont_Bully_Me_SO_Lords    schedule 15.07.2012