![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос MS SQL7.0 D5 [D5, MSSQL]
Evgen123 © (2002-09-13 09:43:00)Вопрос в слудующем D5 MS SQL 7.0 через DBE 5.01.
При добавлении записи (append... post) в таблицу имеющую только PK невозможно "запоститься" возникает ошибка (Record/key deleted).
Ошибка возникает только если на сервере изменялась структура таблицы при открытом НД. Но как с этим бороться? Она теперь появляется постоянно. В коде ошибки нет, т.к. до этого все работало.
На сервере в таблицу запись добавляется без проблем.
По некоторым причинам добавление записи в эту таблицу с использованием запроса или хранимой процедуры не желательно.
Evgen123 (2002-09-13 16:42:00) [1]ermserg СПАСИБО ОГРОМНОЕ.
В статье нашел ответ на мучавший меня вопрос.
Все дело в выставляемых на сервре значениях по умолчанию, а UpdateMode в режиме upWhereAll по этому так и получалось.
ermserg (2002-09-13 15:36:00) [2]Vot chto ya nashol:
http://www.izlabs.com/icezone/docs/articles/bde_feat.shtml
ermserg (2002-09-13 15:35:00) [3]On takzhe perechitivayet ih posle update / insert.
Vozmozhno vso rabotayet Ok do poyavleniya dirok v tablitse (do pervogo delete), potom pri popitke vstavit novuyu zapis ti poluchayesh etu oshibku. Poporobuy s SET IDENTITY_INSERT.
Evgen123 (2002-09-13 15:09:00) [4]ermserg:Он перечитывает запись перед редактированием, а перед добавлением он чего перечитывает? И почему скажем 378 раз он с этим справлялся а потом (после указанных в начале обсуждения действий) перестал. Возможно существует некий кэш на структуру, но тогда где он хранится. Я пробовал установить программу и BDE на другую машину где их никогда не было. Без изменений.
Если убрать базу полностью (физически на сервере) и потом создать ее снова, но не востановлением из архива, а руками таблица за таблицей, тогда работоспособность востанавливается.
Но это же не выход. И потом что заставляет опять понимать друг друга BDE и MS SQL после этого.
ermserg (2002-09-13 14:51:00) [5]Sorry, pohozhe eti triggeri poyavilis tolko v SQL2000. Poprobuy
SET IDENTITY_INSERT myTable ON
Insert into myTable("KeyValue","...")
SET IDENTITY_INSERT myTable OFF
ermserg (2002-09-13 14:36:00) [6]Potomu chto BDE tak rabotaet. On perechitivayet zapis pered redaktirovaniem. Tebe zdes nichego ne sdelat. Edinstvenniy vihod: opredelit dla etoy tablitsi trigger INSTEAD OF INSERT - dlya podrobnostey smotri SQL Books Online
Evgen123 (2002-09-13 13:42:00) [7]ЮЮ: Это значение определяет сервер.
ermserg: BDE перестает узнавать это значение в результате действий см. вопрос. Вопрос как раз в том и состоит ПОЧЕМУ?
Steven: Это даст только "Фигвам" вместо "Record/key deleted" а проблема так и останется.
3JIA9I CyKA (2002-09-13 13:09:00) [8]2Steven © (13.09.02 12:57)
А ds.Open точно не выдаст Exception? 8)
Steven (2002-09-13 12:57:00) [9]попробуй через трай
try
ds.Append;
...
ds.Post;
except
Application.MessageBox("Фигвам", nil, MB_ICONWARNING);
ds.Close;
ds.Open;
end;
ermserg (2002-09-13 12:42:00) [10]BDE vstavlyaet zapis, SQL generiruyet znacheniye key-polya, BDE eto znacheniye ne znayet i terayet zapis. Eto ne sluchayetsya s ADO. Chem tebe ADO ploh?
ЮЮ (2002-09-13 11:53:00) [11]>но тогда и значение ключа не узнать
А кто же тогда определяет это значение?
Evgen123 (2002-09-13 11:44:00) [12]Происходит не удаление а добавление записи, т.о. значение ключа еще не известно.
Следующее замечание ошибка происходит только если Table.Autorefresh:=True если False то добавление происходит без проблем, но тогда и значение ключа не узнать.
REA (2002-09-13 11:15:00) [13]Я пробовал в обработчике события AfterDelete поставить закладку и переместив курсор к ней вернуться - не удается. Именно Record deleted. Пришлось запомнить ключ и делать Locate.
Evgen123 (2002-09-13 10:19:00) [14]Текст ошибки приведен Record/key deleted
В приложении структура соответствует структуре в базе.
К гриду ничего не прицепляется в таблицу просто добавляется запись в результате некоторых вычислений.
Структура менялась не перед тем как BDE непосредственно добавляет запись. Просто НД был открыт (Table.Active:=True) на этапе разработки.
Fiend (2002-09-13 10:06:00) [15]Изменить структуру таблицы, перед тем как БДЕ будет прописывать запись в таблицу э то конечно жёстко, если не сказать больше.
В любом случае при последующем запуске софтины, всё должно работать.
Насколько я понимаю, вы используете живые запросы, а не работаете с НД при помощи UpdateSQL?
Если так, то т.к. вы изменили структуру табл., надо бы и в приложении ее поменять. Вы ж наверно прицепили грид к НД и колонки туда подобавляли?
И скажите котя бы текст ошибки