Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.26;
Скачать: CL | DM;

Вниз

Ошибка при удалении в 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.031 c
3-83325
smol_cerber
2003-05-07 10:48
2003.05.26
BDE + Paradox таблицы версии 3.5 в DOS-кодировке


14-83730
iNew
2003-05-07 10:53
2003.05.26
Кто какими пользуется антивирусами для win2k adv server?


3-83415
Quest
2003-04-29 20:41
2003.05.26
Vendor initialization failed


14-83697
Hooch
2003-05-06 11:47
2003.05.26
Оракл


3-83359
anpv
2003-05-06 09:10
2003.05.26
BLOB(JPEG)->Interbase