Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
3-5975
Gumbert-Gumbert
2004-02-04 15:55
2004.03.03
Как сделать таблицу с такими же полями какие возвращает SQL запро


1-6148
siriusP
2004-02-19 14:13
2004.03.03
Как изменить цвет, толщину линий StringGrida


1-6035
Kair
2004-02-19 08:05
2004.03.03
Message


6-6172
Gorlum
2003-12-26 13:22
2004.03.03
E-mail


1-6063
Centr
2004-02-19 10:00
2004.03.03
TreeNode в TreeView





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