Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при удалении   Найти похожие ветки 

 
_VaaL_   (2002-11-05 16:26) [0]

Здраствуйте.
Использую ADOTable, в таблице при удалении записи возникает исключение:
EOleException with message "Row cannot be located for updating. Some values may have been changed since it was last read".
Причем запись удаляется, если после ексепшена прорефрешить таблицу. Перед удалением выполняется Update-запрос в ту же таблицу и несколько записей апдейтится. После этого идет удаление
Код удаления:
ADOHB.Requery([]);
ADOHB.Refresh;
b:=ADOHB.Locate("HB_ID",CurID,[]);
if b then
ADOHB.Delete;

и всеравно - исключение.
Скорее всего что надо шаманить с типом курсора и/или IsolationLevel для TADOConnection но что именно - не знаю.
Спасибо.


 
KoluChi   (2002-11-05 16:29) [1]

Скорее всего в базе стоит тригер на удаление - все из-за него.


 
_VaaL_   (2002-11-05 16:38) [2]

Тригер и вправду есть но он другие записи в этой же таблице не апдейтит, а просто чистит некоторые таблицы для поддержания целосности БД. Кроме того, если бы глючил триггер то сообщение явно было бы другим, и скорее всего IMHO, это не было бы исключение EOleException.


 
_VaaL_   (2002-11-05 16:50) [3]

Неужели ни у кого таких глюков небыло никогда?


 
oss   (2002-11-05 16:53) [4]

а при работе не через делфи, а уже с ехе есть эта ошибка ?


 
_VaaL_   (2002-11-05 16:59) [5]

Есть


 
oss   (2002-11-05 17:13) [6]

отключи в тулсах дебагера делфи остановку на делфевские ошибки.
плюс, это не лучшее решение, но после удаления закрываи и открывай набор данных


 
_VaaL_   (2002-11-05 17:22) [7]

2 oss

oss>> ...но после удаления закрываи и открывай набор данных
Проблема не в том чтобы перечитать данные а в том чтобы корректно удалить запись.
Конечно можно делать удаление в блоке Try/except а потом рефрешить таблицу. Но, согласитесь, это не выход так как ошибка просто маскируется от пользователя, но остается. Хотелось бы добится корректного удаления без шаманства.
Хорошо что таблица будет небольшая (я это точно знаю), но если бы там было под пару сотен тысяч записей, то согласитесь, частые рефреши и переоткрытие таблици - не выход. :(((


 
Fiend   (2002-11-05 17:38) [8]

Я надеюсь первичный ключ у вас есть?
;)


 
KoluChi   (2002-11-05 17:38) [9]

А сама запись в триггере удаляется?


 
_VaaL_   (2002-11-05 17:53) [10]

2 Fiend
Ключик есть, автоинкремент :), но в таблице стоит IndexFieldNames:="HB_Order"; так как записи реально должны сортироватся по колонке HB_Order, а Primary Key только для уникальности записи.

2 KoluChi
У меня не INSTEAD OF DELETE тригер а обычный ON DELETE, тоесть запись "уже удалена" (находится во временной таблице DELETED).
Тоесть тригер не удаляет записи он только может сделать откат если что.
За тригер волноватся не надо так как работает он отменно. при удалении записи непосредственно из QA проблем никаких не возникает.


 
Fiend   (2002-11-05 18:15) [11]

А что если вам привести тута скрипт таблицы, триггеров на ней?
думаю разберемся


 
_VaaL_   (2002-11-05 18:33) [12]

Таблица:
CREATE TABLE HandBook
(HB_ID BIGINT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
HB_Name_0 VARCHAR(256) NOT NULL,
HB_Name_1 NVARCHAR(256),
HB_Name_2 NVARCHAR(256),
HB_Name_3 NVARCHAR(256),
HB_Bold TINYINT NOT NULL,
HB_Order INT NOT NULL,
HB_Text_0 BIGINT,
HB_Text_1 BIGINT,
HB_Text_2 BIGINT,
HB_Text_3 BIGINT)




Тригер:
CREATE TRIGGER Trig_Del_Handbook
ON HandBook
FOR DELETE
AS
BEGIN
DECLARE @PI BIGINT
DECLARE @PMax BIGINT
DECLARE @PText_0 BIGINT, @PText_1 BIGINT, @PText_2 BIGINT, @PText_3 BIGINT
BEGIN TRAN
SET @PMax = (SELECT Max(HB_ID) FROM Deleted)
SET @PI = (SELECT Min(HB_ID) FROM Deleted)
WHILE @PI <= @PMax
BEGIN
SELECT @PText_0 = HB_Text_0,
@PText_1 = HB_Text_1,
@PText_2 = HB_Text_2,
@PText_3 = HB_Text_3
FROM Deleted
WHERE HB_ID = @PI
DELETE FROM Text_Data
WHERE (TD_ID = @PText_0) AND
(TD_Type = (SELECT dbo.fn_Tab_ID("HandBook"))) AND
(TD_Loop = @PI)
DELETE FROM NText_Data
WHERE (NTD_ID = @PText_1 OR NTD_ID = @PText_2 OR NTD_ID = @PText_3) AND
(NTD_Type = (SELECT dbo.fn_Tab_ID("HandBook"))) AND
(NTD_Loop = @PI)
SET @PI = (SELECT Min(HB_ID) FROM Deleted
WHERE @PI < HB_ID)
IF @PI IS NULL
SET @PI = @PMax + 1
END
COMMIT TRAN
END
GO

Если с таблицей все понятно то по тригеру вот вам мои коментарии:
В цыкле WHILE @PI <=@PMax прохожу по всех удаленных записях и удаляю все текста, которые принадлежат к этой записи, но хранятся в других таблицах (Text_Data и NText_Data). Хранение больших текстов в отдельных таблице обусловлено тем что так легче и быстрее производить поиск по БД (функция поиска на сайте). Похожие тригеры стоят и на других таблицах и никаких проблем не возникает. Исходники я привел, но позволю себе повторится - проблема не в тригере.


 
legionary   (2002-11-06 10:06) [13]

Такая ошибка происходит из за тригера. Например ты удаляешь из таблицы t1 запись,а в тригере идет update/delete/insert на таблицу t1. Или на удаление t1 идет update в таблице t2, которая в свою очередь связана с таблицей t1 констрейном или триггером



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.014 c
1-82813
ctapik-net
2002-11-13 18:13
2002.11.25
Получить ширину печатоемой страницы принтера в пикселях


3-82620
Viktor1
2002-11-05 13:43
2002.11.25
Объясните разницу ADO и DAO!!!


1-82802
Sego
2002-11-13 15:30
2002.11.25
Что быстрее?


7-83030
progger
2002-09-24 18:04
2002.11.25
Как организовать поиск файла в каталоге и вложенных папках?


14-82985
Undert
2002-11-06 21:09
2002.11.25
Люди ! Есть идеа по взаимной раскрутки сайтов ! ...





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