Форум: "Базы";
Текущий архив: 2004.03.03;
Скачать: [xml.tar.bz2];
ВнизЗапросы на вставку и Исключения Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c