Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-83685
Supreme 2
2003-05-06 09:05
2003.05.26
Вы верите в Бога?


4-83823
АлексКриппер
2003-03-31 14:18
2003.05.26
Манипуляция иконками раб. стола


1-83451
Gunny
2003-05-14 19:40
2003.05.26
Подскажите как можно узнать какая ячейка выбрана в Stringgride


14-83751
ZeroDivide
2003-05-07 12:12
2003.05.26
Кто-нибудь собираеться в Питер на 300 летие?


1-83590
R
2003-05-12 01:37
2003.05.26
Сортировка чисел по возрастанию.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский