Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запросы на вставку и Исключения [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)


Наверх

Титульная страница Поиск, карта сайта Написать письмо