![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запросы на вставку и Исключения [D6, Paradox]
alex-ran © (2004-02-05 15:11:00)
Уважаемые Мастера, хочу перехватывать исключительные ситуации при выполнении запросов типа:
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 возникает ошибка?
Sandman25 (2004-02-05 18:17:00) [1]
Согласен с [16] Digitman © (05.02.04 18:14).
Все равно нужно будет построчно разбираться с теми строками, которые не могут вставиться при insert select.
Digitman (2004-02-05 18:14:00) [2]
> так вот эта одна вставиться, а то что была попытка вставить
> еще 9 я и не узнаю. Что мне и не нравится
ну а что толку, если ты узнаешь, что была попытка key violation ?
ты же не сможешь при таком запросе (даже если он сработает как надо) узнать, какая именно запись из числа возвращенных вложенным селектом вызвала нарушение ? тебе все равно придется откатывать транзакцию, ибо пропустить запись, вызывающую нарушение (или подкорректировать ее "на ходу" перед попыткой повторной вставки), ты не имеешь возможности
выполни отдельный селект, открой курсор, в цикле пройди по возвращенному НД, для каждой тек.записи выполни insert .. into .. valets, заключенный в блок обработки исключений ...
как только споткнешься на исключении по нарушению . либо пропускай запись либо, если возможно, скорректируй ее должным образом и повтори INSERT скорректированной записи
делов то ... все равно все это на кл.стороне делается движком БДЕ ... разницы практически никакой, главное - препарировать INSERT-запрос заблаговременно перед первым запуском
Sandman25 (2004-02-05 18:07:00) [3]
[14] alex-ran (05.02.04 18:02)
Делаете тестовые таблички, в SQL Explorer к ним подключаетесь, заполняете данными и выполняете insert into select, который должен вызвать ошибку, потом смотрите содержимое таблицу, в которую вставляли. Если изменилось - пишите Borland"у :)
alex-ran (2004-02-05 18:02:00) [4]
> Sandman25 ©
Это требование SQL. Другое дело, что при реализации в LocalSQL разработчики от Borland могли допустить ошибку
А как узнать разработчики от Borland допустили ошибку, или мои кривые руки? Только методом научного втыка? :)
Sandman25 (2004-02-05 17:52:00) [5]
[12] Digitman © (05.02.04 17:49)
Честно говоря, я Ваш намек тоже не понял :)
Digitman (2004-02-05 17:49:00) [6]
> Sandman25 © (05.02.04 17:29) [11]
вот и я на то намекаю
Sandman25 (2004-02-05 17:29:00) [7]
[8] alex-ran (05.02.04 16:54)
Это требование SQL. Другое дело, что при реализации в LocalSQL разработчики от Borland могли допустить ошибку
alex-ran (2004-02-05 17:08:00) [8]
Попробую,
Johnmen (2004-02-05 16:56:00) [9]
>alex-ran
BDE как я понял ?
Попробуй Database.StartTransaction и Database.Commit/Rollback
(эмуляция транзакций в данном случае...)
alex-ran (2004-02-05 16:54:00) [10]
> 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 ©
А вы твердо уверены, что хотя бы при одной ошибочной записи не вставляется ни одна? А если это глюк, то он странно выглядит, т. к. я пробовал на разных машинах и везде одно и то же.
alex-ran (2004-02-05 16:49:00) [11]
Digitman ©
Sandman25 (2004-02-05 16:42:00) [12]
[4] alex-ran (05.02.04 16:37)
Очень странно. Я тоже работаю иногда с Paradox в D6 через BDE, но таких глюков не замечал.
Digitman (2004-02-05 16:39:00) [13]
у меня смутное подозрение, что вар-т 2 все же должен выглядеть подобно вар-ту 1 :
insert into ... values(select ..)
alex-ran (2004-02-05 16:37:00) [14]
А вот и нет, я же пробовал. см. 2.
Вот именно что "Либо вставляются все записи из этого select, либо ни одной"меня устроило бы на все 100, но реально почему то так не получается: все "нормальные" записи вставляются, а ошибочные - нет. Что и плохо.
Sandman25 (2004-02-05 16:19:00) [15]
[2] alex-ran (05.02.04 16:18)
insert into ... select ... является неделимой операцией. Либо вставляются все записи из этого select, либо ни одной.
alex-ran (2004-02-05 16:18:00) [16]
а эксепшэны там же ловить?
Я не сказал что не работают запросы, я хочу отлавливать исключения при попытке вставки некорректных данных, и если при попытке вставки запросом типа 2 возникает ошибка при попытке вставки хотя бы одной записи, а остальные вставились нормально - то я должен об этом знать.
А сейчас происходит так: допустим в результате селекта отобралось 10 записей, 9 из них дублируются, 1 нет, так вот эта одна вставиться, а то что была попытка вставить еще 9 я и не узнаю. Что мне и не нравится
SasaR (2004-02-05 15:57:00) [17]
Миракле :))
Попробуй свои запросы вначале в сторонней тулзне, частями (Database explorer)