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

Вниз

ado при execsql не выдает ошибку?   Найти похожие ветки 

 
Ellisium ©   (2014-10-21 16:54) [0]

Ms sql сервер, подключение через ado, написаны ряд команд в adoquery - select,  потом insert, потом update.

Если при insert возникнет исключение - то дальше ничего не выполнится (в частности update) но никакого исключения не возникнет !! Что за нафиг ?


 
кгшз ©   (2014-10-21 16:57) [1]

если адейт не выполняется, значит возникает.
а если не возникает, значит выполняется.
или ты веришь в деда мороза?


 
Ellisium ©   (2014-10-21 17:13) [2]

Не дописал, в смысле что не выбрасывается
исключение в адо. То есть, ExecSql выполняется без исключения хотя внутрях сервера исключение видимо возникает.

При open такого никогда не происходит


 
Ellisium ©   (2014-10-27 14:23) [3]

Никто не знает ?


 
Jeer ©   (2014-10-27 15:22) [4]

Попробуй начать с самого начала.


 
Ellisium ©   (2014-10-27 20:32) [5]

Имеем MS SQL server (2005, хотя вряд ли играет значения). Подключаемся к нему из Delphi по ADO.

Выполняем:

ADOQuery.sql.text :=
   "insert into myTable (field1) values (1); "+
   "insert into myTable (field1) values (2); "+
   "insert into myTable (field1) values (3);" ;
ADOQuery.ExecSql;


Если на второй операции (insert into myTable (field1) values (2);) произойдет ошибка внутрях БД (например, сработает некое ограничение) - то следующая операция не будет выполнена, да и вообще выполнение прервется, но при этом само ADOQuery не сгенерирует иключение. Происходит это именно на ExecSQL и если комманд несколько. Если одна комманда - то исключение "всплывает".

При этом такого никогда не происходит при .Open, например переделаем код:

ADOQuery.sql.text :=
   "insert into myTable (field1) values (1); "+
   "insert into myTable (field1) values (2); "+
   "insert into myTable (field1) values (3);" +
   "select 1; ";
ADOQuery.Open;


В данном случае ошибки будут сгенерированы всегда.

Вот что это за фишка и почему так?


 
Dennis I. Komarov ©   (2014-10-27 21:45) [6]

1. ADOQuery => ADOCommand
2. Зачем несколько инсертов в одном запросе без транзакций?


 
sniknik ©   (2014-10-28 09:36) [7]

> Если одна комманда - то исключение "всплывает".
там на каждую команду свой ответ приходит, посмотри в хелпе метод "ексептион" в коннекте.

еще попробуй ставить SET NOCOUNT ON в начале пакета, он запрещает "пустые" сообщения только с количеством, значит должен "проскочить"  до ошибки.


 
Ellisium ©   (2014-10-28 14:19) [8]

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


 
sniknik ©   (2014-10-29 08:46) [9]

> А почему при .Open всегда всплывает исключение, если оно произошло?
логика ADODataSet в возвращении данных, он перебирает рекордсеты до непустого, или ексепта. а т.к. данные в твоем пакете только в последней команде то и получается возврат. сделай пакет так
insert into myTable (field1) values (1);
select 1;
insert into myTable (field1) values (2);
insert into myTable (field1) values (3);

не будет, если ошибка на втором инсерте.

> Как добиться такого же поведения от .ExecSql?
никак. с ADOQuery ничего не стоит добиваться, он не нелогичен, его нужно просто удалить и не париться.


 
Ellisium ©   (2014-10-29 12:34) [10]

Sniknik, во всем разобрался теперь!  Спасибо


 
Ellisium ©   (2014-10-29 12:34) [11]

Sniknik, во всем разобрался теперь!  Спасибо



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

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

Наверх




Память: 0.49 MB
Время: 0.113 c
1-1331112835
Deltas
2012-03-07 13:33
2015.09.10
TOleContainer и Excel


11-1259936563
Егорка
2009-12-04 17:22
2015.09.10
Сервисы + Win7


4-1272012311
bwwebm
2010-04-23 12:45
2015.09.10
Функция _open_osfhandle или ее импорт


2-1394848571
Artem
2014-03-15 05:56
2015.09.10
Разделить текст по столбцам


15-1415975355
LIFTEX
2014-11-14 17:29
2015.09.10
Вопрос по версиям среды разработки