Записът е променен от друг потребител при опит за публикуване или редактиране

Разработвам приложение с помощта на Delphi 7 и Sql Server express 2008 R2, използвам BDE за свързване на Sql сървър чрез ODBC и се използва SQL Native Client за шофьор.

В някои конкретни форми компонентът на таблицата повдига EDBEngineError 'Записът е променен от друг потребител', просто се опитвам да добавя данни, същият проблем възниква, когато table.cancel, table.post, table.edit.....

Няколко дни преди да променя драйвера от SQL Server на Sql Native Client, тъй като sql сървърът има проблем с „връзката има набор от резултати за друг hstmt“, така че го промених към SQL Native клиент, от това срещнах тази грешка „Записът е променен от друг потребител“.

Моля за помощ


person bejarun    schedule 30.01.2012    source източник
comment
трябва да намерите начин да видите генерирания SQL, за да откриете основната причина, препоръчвам да компилирате с Use Debug DCUs и да влезете в изходния код на 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 или библиотека на 3d страна като 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
благодаря ви за отговора, първо разработих това приложение с помощта на db на Paradox, след това мигрирах в sql сървър, имам 100 компонента на таблици в datamodule, така че не е лесно да ги променя на друга трета част comp, създайте OBDC източници на данни и го свържете чрез BDE, и тази грешка „запис, заключен от друг потребител, ще се появи само във временни таблици (името на таблицата започва с „#“), също се опитах с драйвера на sqlserver, не мога да намеря коя заявка е частично извлечени данни, така че преобразувах в sqlnative клиент, след като промених това „hstmt error gone“, но се появи грешка при заключен запис, - person bejarun; 31.01.2012
comment
Хубав списък от @da-soft.. Имахме същия проблем.. И в нашия случай открихме, че един от тригерите на определена таблица изпълнява оператора „PRINT“. Коментирахме го и това разреши грешката. - person NamoRamana; 13.10.2020

Приятелю, трябва да обмислиш актуализиране на инструментите си за разработка. За този проблем наистина трябва да работите с ZEOS Component Pack за Delphi. Може да се свързва с много видове бази данни, включително Firebird, MySQL, Access и SQL Server. Всичко, което трябва да направите, е да поставите dll на базата данни, която използвате, в директорията на вашия проект и bin директорията на delphi (ако целевият компютър няма мениджър на базата данни). След това оставяте сървъра на базата данни да се грижи за транзакциите. Ако имате нужда от повече подробности, просто ми дайте сигнал.

person Please_Dont_Bully_Me_SO_Lords    schedule 15.07.2012