Главная страница
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.096 c
2-1394538433
Ce4kok
2014-03-11 15:47
2015.09.10
Разложение в ряд функции


15-1421388097
Silvestr22
2015-01-16 09:01
2015.09.10
SSD кеш на неосновной диск - возможно ли ?


2-1392732185
Alex_C
2014-02-18 18:03
2015.09.10
Событие OnPaint для компонентов


15-1419680039
alexdn
2014-12-27 14:33
2015.09.10
Папки в Skype


15-1421265883
sysdmg4
2015-01-14 23:04
2015.09.10
Система тестирования ПО на основе виртуальных машин - нужен совет