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