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

Вниз

Запросы на вставку и Исключения   Найти похожие ветки 

 
alex-ran   (2004-02-05 15:11) [0]

Уважаемые Мастера, хочу перехватывать исключительные ситуации при выполнении запросов типа:
1)
INSERT INTO "Customer.db" (CustNo, Company)
VALUES (9842, "Inprise Corporation")
2)
INSERT INTO "Customer.db" (CustNo, Company)
SELECT CustNo, Company FROM "OldCustomer.db"

Для этого пишу примерно такое:
try
ExecSQL;
except
on E:Exception do ShowMessage("Перехвачена ошибка "+E.Message);
end;

При попытке вставить уже существующие значения ключевого поля, при обработке запроса 1 попадаю в блок обработки исключений (Key violation), а при попытке обработки запроса 2 исключения не возникает (хотя весь вставляемый НД заведомо дублируется и должно быть Key violation) и хотя ошибки вроде и нет записи не добавляются.
Как отловить что при запросе 2 возникает ошибка?


 
SasaR   (2004-02-05 15:57) [1]

Миракле :))
Попробуй свои запросы вначале в сторонней тулзне, частями (Database explorer)


 
alex-ran   (2004-02-05 16:18) [2]

а эксепшэны там же ловить?
Я не сказал что не работают запросы, я хочу отлавливать исключения при попытке вставки некорректных данных, и если при попытке вставки запросом типа 2 возникает ошибка при попытке вставки хотя бы одной записи, а остальные вставились нормально - то я должен об этом знать.
А сейчас происходит так: допустим в результате селекта отобралось 10 записей, 9 из них дублируются, 1 нет, так вот эта одна вставиться, а то что была попытка вставить еще 9 я и не узнаю. Что мне и не нравится


 
Sandman25 ©   (2004-02-05 16:19) [3]

[2] alex-ran (05.02.04 16:18)

insert into ... select ... является неделимой операцией. Либо вставляются все записи из этого select, либо ни одной.


 
alex-ran   (2004-02-05 16:37) [4]

А вот и нет, я же пробовал. см. 2.
Вот именно что "Либо вставляются все записи из этого select, либо ни одной" меня устроило бы на все 100, но реально почему то так не получается: все "нормальные" записи вставляются, а ошибочные - нет. Что и плохо.


 
Digitman ©   (2004-02-05 16:39) [5]

у меня смутное подозрение, что вар-т 2 все же должен выглядеть подобно вар-ту 1 :

insert into ... values(select ..)


 
Sandman25 ©   (2004-02-05 16:42) [6]

[4] alex-ran (05.02.04 16:37)

Очень странно. Я тоже работаю иногда с Paradox в D6 через BDE, но таких глюков не замечал.


 
alex-ran   (2004-02-05 16:49) [7]

Digitman ©


 
alex-ran   (2004-02-05 16:54) [8]


> Digitman ©

По справке читаем:
To add rows to one table that are retrieved from another table, omit the VALUES keyword and use a subquery as the source for the new rows.
По моему нам недвусмысленно заявляют об опускании VALUES

> Sandman25 ©

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


 
Johnmen ©   (2004-02-05 16:56) [9]

>alex-ran

BDE как я понял ?
Попробуй Database.StartTransaction и Database.Commit/Rollback
(эмуляция транзакций в данном случае...)


 
alex-ran   (2004-02-05 17:08) [10]

Попробую,


 
Sandman25 ©   (2004-02-05 17:29) [11]

[8] alex-ran (05.02.04 16:54)

Это требование SQL. Другое дело, что при реализации в LocalSQL разработчики от Borland могли допустить ошибку


 
Digitman ©   (2004-02-05 17:49) [12]


> Sandman25 © (05.02.04 17:29) [11]


вот и я на то намекаю


 
Sandman25 ©   (2004-02-05 17:52) [13]

[12] Digitman © (05.02.04 17:49)

Честно говоря, я Ваш намек тоже не понял :)


 
alex-ran   (2004-02-05 18:02) [14]


> Sandman25 ©

Это требование SQL. Другое дело, что при реализации в LocalSQL разработчики от Borland могли допустить ошибку

А как узнать разработчики от Borland допустили ошибку, или мои кривые руки? Только методом научного втыка? :)


 
Sandman25 ©   (2004-02-05 18:07) [15]

[14] alex-ran (05.02.04 18:02)

Делаете тестовые таблички, в SQL Explorer к ним подключаетесь, заполняете данными и выполняете insert into select, который должен вызвать ошибку, потом смотрите содержимое таблицу, в которую вставляли. Если изменилось - пишите Borland"у :)


 
Digitman ©   (2004-02-05 18:14) [16]


> так вот эта одна вставиться, а то что была попытка вставить
> еще 9 я и не узнаю. Что мне и не нравится


ну а что толку, если ты узнаешь, что была попытка key violation ?
ты же не сможешь при таком запросе (даже если он сработает как надо) узнать, какая именно запись из числа возвращенных вложенным селектом вызвала нарушение ? тебе все равно придется откатывать транзакцию, ибо пропустить запись, вызывающую нарушение (или подкорректировать ее "на ходу" перед попыткой повторной вставки), ты не имеешь возможности

выполни отдельный селект, открой курсор, в цикле пройди по возвращенному НД, для каждой тек.записи выполни insert .. into .. valets, заключенный в блок обработки исключений ...
как только споткнешься на исключении по нарушению . либо пропускай запись либо, если возможно, скорректируй ее должным образом и повтори INSERT скорректированной записи

делов то ... все равно все это на кл.стороне делается движком БДЕ ... разницы практически никакой, главное - препарировать INSERT-запрос заблаговременно перед первым запуском


 
Sandman25 ©   (2004-02-05 18:17) [17]

Согласен с [16] Digitman © (05.02.04 18:14).
Все равно нужно будет построчно разбираться с теми строками, которые не могут вставиться при insert select.



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

Текущий архив: 2004.03.03;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
14-6216
Shaman
2004-02-11 13:06
2004.03.03
Глюк: пропадают изображения в иконках на рабочем столе


14-6231
Undert
2004-02-10 18:48
2004.03.03
TClientSocket + POST


1-6070
race1
2004-02-21 15:01
2004.03.03
двумерный tlist


3-5980
Zilog
2004-02-05 11:48
2004.03.03
Динамически создаю таблицы в БДЕ. Проверка существующего имени


3-5999
Pul
2004-02-06 12:11
2004.03.03
Update нескольких таблиц через TIBQuery