Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка при удалении в ADOQuery. [D7, MSSQL]


Страницы:   1 2

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 все то тоже на ок и из интерпрайз менеджера тоже.
Блин я ужо голову сломал на этом.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо