Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Вниз

TAdoQuery - "обновление"??? при удалении записи   Найти похожие ветки 

 
Rav   (2007-02-18 15:46) [0]

Доброго времени суток!

Подскажите, уважаемые, что за глюк!
На форме лежит TAdoQuery. CursorLocation = clUseClient, CursorType = ctKeyset. При добавлении, изменении запсей ведет себя совершенно нормально, а при удалении "стандартной" командой Delete
SR_OPGROUPS.Delete;
вылетает исключение: "Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения".
Если ставлю CursorLocation = clUseServer - ошибка при удалении пропадает, но при ИЗМЕНЕНИИ записи начинает ругаться MS SQL на нарушение ссылочной целостности (хотя я запись из таблицы и не собирался удалять):
UPDATE statement conflicted with COLUMN REFERENCE constraint "FK_SR_OPGLINKS_GRP". The conflict occurred in database "it_base", table "SR_OPGLINKS", column "ID_OPGROUPS"
Такое ощущение, что при clUseServer при изменении запись сначала удаляется из базы и снова туда заносится.
Получается замкнутый круг.... Просвятите плиз! Можно на мыло
Заранее спасибо!


 
MsGuns ©   (2007-02-18 16:00) [1]

Используйте Primary Key и Autoincrement


 
sniknik ©   (2007-02-18 16:00) [2]

ключевое поле в запросе с обновлениями обязательно. (есть вариант когда работает и без него, но через задницу, за счет скорости обновлений, составляя уникальное значение для поиска обновляемой записи из всех полей запроса)

> На форме лежит TAdoQuery
положи вместо него TADODataSet


 
Rav   (2007-02-18 16:07) [3]

Ключевое поле присутствует:
CREATE TABLE SR_OPGROUPS (
ID int NOT NULL ,
NAME str64 NULL ,
NOTES str255 NULL ,
CONSTRAINT PK_SR_OPGROUPS_ID PRIMARY KEY  CLUSTERED (ID)
)


 
sniknik ©   (2007-02-18 16:14) [4]

> Ключевое поле присутствует:
> CREATE TABLE ...
не про таблицу речь, а про запрос.

.... и, у тебя что за значения в ключе? или CLUSTERED убери, или поле ID автоинкриментным сделай. смысл CLUSTERED  имеется только если значения добавляются с приращением, если вразнобой (например рандомом получаемые) то единственное чего добьешся это тормозов на добавлении.


 
Rav   (2007-02-18 16:20) [5]

запрос самый обычный
select * from SR_OPGROUPS order by ID


 
Rav   (2007-02-18 16:23) [6]

да, еще....
ругаться - ругается, а запись из таблицы удаляется


 
sniknik ©   (2007-02-18 16:38) [7]

> запрос самый обычный
> ...
ну тогда может действительно "Некоторые значения могли быть изменены со времени ее последнего чтения"? ничего не меняешь, со стороны, в смысле запросами/из других датасетов а не только показанного? значение ключа трогаешь? (если нет, то поставь у датасета после открытия (можно в событии после открытия) ADODataSet1.Properties["Update Criteria"].Value:= adCriteriaKey; это явное указание задействовать ключ для запросов на обновление)

> Такое ощущение, что при clUseServer при изменении запись сначала удаляется из базы и снова туда заносится.
а как ты хотел, небось значение ключа меняешь, вот таблица и перестраивается. (кластеред означает что записи идут в порядке значения ключа... без удаления и записи ее на новое место не поставишь.)


 
Anatoly Podgoretsky ©   (2007-02-18 16:51) [8]

> Rav  (18.02.2007 16:23:06)  [6]

Не используй TAdoQuery


 
Rav   (2007-02-18 16:56) [9]

Странно, но после удаления вроде бы обычного триггера на удаление из этой таблицы ругаться перестало. Может триггер кривой, посмотрите:
CREATE TRIGGER SR_OPGROUPS_DELETE ON dbo.SR_OPGROUPS
FOR DELETE
AS
BEGIN
 delete from SR_OPGLINKS where SR_OPGLINKS.ID_OPGROUPS in
  (select ID from DELETED)
 delete from SU_OPGLINKS where SU_OPGLINKS.ID_OPGROUPS in
  (select ID from DELETED)
END


> небось значение ключа меняешь

Неа.... иначе бы не спрашивал
Значение ID формируется для всех таблиц базы единообразно - дело в том, что значение ID нужно уже сразу после DataSet.Applend, а автоинремент даст результат только после сохранения в базе. Поэтому я генерирую ID при вставке процедурой с блокировкой в специальной таблице (дабы несколько пользователей могли одновременно вставлять записи). Затем ID НЕ МЕНЯЕТСЯ! В других таблицах это работает без глюков


 
Rav   (2007-02-18 17:06) [10]


> Не используй TAdoQuery

Использование TAdoDataSet дает такой же результат... :-(


 
sniknik ©   (2007-02-18 17:07) [11]

вообще SET NOCOUNT ON в начале ставят, а в конце выключают.

а внешними ключами то же самое не проще?

> Использование TAdoDataSet дает такой же результат... :-(
не связано с вопросом, просто идеологически неверный компонент...


 
Anatoly Podgoretsky ©   (2007-02-18 17:27) [12]

> Rav  (18.02.2007 17:06:10)  [10]

А надо AdoCommand


 
Rav   (2007-02-18 17:41) [13]


> вообще SET NOCOUNT ON в начале ставят, а в конце выключают.

СЕНКС!!! СЕНКС!!! СЕНКС!!! ПОМОГЛО!
К сожалению пока плохо рабираюсь в таких тонкостях SQL - всему приходится учиться на своих ошибках...

Всем спасибо за помощь!!!!!!!!!!



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.05.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.035 c
2-1176893560
delphi_
2007-04-18 14:52
2007.05.06
расположение кнопок "Свенуть" "Развернуть" "Закрыть"


2-1176705162
allucard
2007-04-16 10:32
2007.05.06
Как созданный класс сделать дочерним классу TForm?


3-1171807050
иван8511
2007-02-18 16:57
2007.05.06
Добавление нового поля


3-1171611402
zorik
2007-02-16 10:36
2007.05.06
Firebird 2. Declare procedure


3-1171348665
xKL
2007-02-13 09:37
2007.05.06
Как выловить клик мыши на DBGrid?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский