Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
ВнизОшибка при удалении в ADOQuery. Найти похожие ветки
← →
Babay (2003-04-28 04:53) [0]Доброго времени суток, уважаемые!
У меня на MSSQL - сервер есть табличка (MyTable) с разными полями. Одно из полей автоинкрементальное.
На форме в проге связка ADOConnection ->AdoQuery->DataSource-> DbGrid->DBNavigator все это дело завязано на таблицу MyTable. В Query запрос такой:
Select *
from MyTable
С помощью навигатора добовляем удаляем записи в таблице все ок.
Но стоит поставить на таблицу тригер на удаление (в тригере идет удаление записей из другой таблицы) то при удалении записей через программу возникает ошибка:
"Неудается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения."
Однако запись на сервере удалятся и тригер срабатывает. В DBGrid запись остается видимой. Потом перееоткрываем Query и видим, что записи действительно нет. При этом я точно знаю что с таблицей никто кроме меня не работает и изменять никто ничего немог.
Кто нибудь может объяснить в чем дело и как это победить?
← →
BoxTer (2003-04-28 08:01) [1]текст триггера на бочку...
← →
Babay (2003-04-28 08:12) [2]CREATE TRIGGER [DeleteUser] ON dbo.MyTable
FOR DELETE
AS
delete from MyTable1
where MyTable1.User_Id in (select [Id] from Deleted)
delete from MyTable2
where MyTable2.User_Id in (select [Id] from Deleted)
Причем удаление просто запросом из QueryAnalyser проходит без ошибок
← →
Babay (2003-04-28 08:28) [3]Да вот еще что вылезло
если в таблицах MyTable1,MyTable2 есть записи для удаления то вылазит уже другая ошибка:
Недостаточные или неполные сведения о ключевом поле. Обновление влияет на слишком большое число строк.
Но в Mytable удаляется всего 1 строка, в Mytable1 - 2, в MyTable2 - 1.
Ну и естесственно все повторяется, т.е. все удаляется тригер срабатывает нормально. Из QueryAnalyser все то тоже на ок и из интерпрайз менеджера тоже.
Блин я ужо голову сломал на этом.
← →
BoxTer (2003-04-28 08:32) [4]а скока ключевых полей в Т1 и Т2?
и как их звать?
← →
Babay (2003-04-28 08:38) [5]Вот структура таблиц
MyTable
Id:Int автоинкрементальное поле
UserName :VarChar(50)
Description:VarChar(255)
Pole1:Bit
Pole1:Bit
MyTable2
Id:Int автоинкрементальное поле - просто номер записи
User_Id:Int
Sv_Id:Int
MyTable2 (такая же как 1)
Id:Int автоинкрементальное поле - просто номер записи
User_Id:Int
Sv_Id:Int
Ключевые поля не назначались
← →
Babay (2003-04-28 08:41) [6]Извиняюсь
MyTable
Id:Int автоинкрементальное поле
UserName :VarChar(50)
Description:VarChar(255)
Pole1:Bit
Pole2:Bit
Pole3:Bit
← →
BoxTer (2003-04-28 08:45) [7]блин, давай попробуем по простому пути: забей на этот триггер и сделай DIAGRAM, где укажи все свои связи и поставь птичек напротив каскадного удаления и обновления записей... усе будет работать, но еси табе нужен именно триггер, будем думать...
← →
Babay (2003-04-28 08:54) [8]Нужен тригер
Записи во всех таблицах формируются динамическими запросами. Единственное чтол при удалении в myTable надо чтобы соответствующие записи в остальных удалялись. Без тригера ошибки нет, но соответственно ничего и не удаляется. Хотелось по прямому пути, но видимо придется динамически удалять, и рефрешить. Блин...
← →
NAlexey (2003-04-28 09:21) [9]Кажется чегото ты не договариваешь... Попробуй провести эксперемент: AdoConnection, TADOSQL1( select * from MyTable) + TDataSource + DBGrid.
Получил значит записи. Второй TADOSQL2( delete MyTable where (*какое нибудь условие, ну или номер ID записи которую не жалко*)) + TADOSQL1.Requery . Что произойдет? Включи Profiler, отследи выполняющиеся запросы. Только сделай все с нуля.
← →
Babay (2003-04-28 09:36) [10]пока вот так сделал
в событии onDeleteError написал
Action:=daAbort;
DataSet.Close;
DataSet.Open;
ошибка есть тока пока в Д работаешь при запуске ехе не показывает. Шаманство конечно, а что делать...
По тому что ты предложил
загоняем в другой квери
Delete from MyTable where Id=1
делаем qr1.execSql
и все ок.
Я же говорю запросом все пролодит не проходит именно через навигатор. Вот и немогу врубиться в чем дело...
← →
NAlexey (2003-04-28 09:51) [11]А попробуй к MyTable не ч.з ADOQuery а ADOTable.
← →
Babay (2003-04-28 09:54) [12]Table не устраивает.
Да и скорее всего будет то же. Table это оболочка как и квери так что работа у них схожая.
← →
NewD (2003-04-28 12:51) [13]Похоже, дело не в тригере у меня подобная ошибка возникала в ADO, когда я изменял записи, потом делал Post и пытался обратиться к записям, не делая Requery.
Возможно, что где-то в событиях ты то же пытаешься обратиться к записям этих таблиц.
Попробуй отключать комп. наборы данных для этих таблиц, а затем включать.
← →
Babay (2003-04-29 05:13) [14]To NewD
чето я непонял насчет
->Возможно, что где-то в событиях ты то же пытаешься обратиться к записям этих таблиц.
->Попробуй отключать комп. наборы данных для этих таблиц, а затем включать
у меня на форме нет ничего кроме того что я указал. Никакие события не задействованы. Просто хочу удалять записи через DBNavigator, А он мне ошибки дает...
← →
NAlexey (2003-04-29 08:37) [15]>А он мне ошибки дает...
Ты мне для успокоения скажи, ты ч.з ADOTable попробывал или нет?:)
← →
Babay (2003-04-29 08:44) [16]Да сделал все с нуля отдельным приложением. Все то же.
я же говорил.....
← →
Babay (2003-04-30 05:39) [17]Ну так что так никто и не знает?
← →
NewD (2003-04-30 09:37) [18]Проблема возможно в том, что ADO пытается обновить набор.
Ты выключай наборы работающие с данными во время
изменения - там же старые данные.
ADO узнает что их уже обновили на сервере и выдает такую ошибку.
Отключай наборы и подключай снова.
← →
Babay (2003-05-05 07:46) [19]To NewD
чето я несовсем понимаю.
1. Кто обновил данные? Я же говорю я точно знаю что кроме меня никто не работает с этой таблицей.
2. как (когда) отключать наборы?. В форме нет ниодной строки кода чистая завязка ADOConnection ->AdoQuery->DataSource-> DbGrid->DBNavigator и все, жму кнопку удаления в навигаторе и получаю ошибку. При этом все срабатывает (удаление, тригеры).
3. Курсор для квери у меня статический на стороне клиента и соответственно не отслеживает никакие изменеия в таблице, поэтому с чего вдруг квери пытается обновить старый набор данных?
вообщем чето я не догоняю...
← →
АлексейК (2003-05-05 08:18) [20]Данные обновил trigger, поскольку из него идет вставка. И видимо в данном случет твой набор данных зависит от этих изменений.
← →
Babay (2003-05-05 08:38) [21]Тригер ничего не вставляет. Он удаляет причем из других таблиц которые у меня нигде не видны и к ним нет обращений...
Т.о. мой набор никак не зависит от тригера.
← →
Babay (2003-05-07 04:31) [22]Да .... видать не судьба.... :=((#
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.05.26;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.011 c