Главная страница
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.078 c
15-1418506204
Юрий
2014-12-14 00:30
2015.09.10
С днем рождения ! 14 декабря 2014 воскресенье


2-1396356964
Дмитрий
2014-04-01 16:56
2015.09.10
0,1 is not a valid BCD value


2-1395731174
Сергей
2014-03-25 11:06
2015.09.10
Определить тип данных


15-1412022602
Юрий
2014-09-30 00:30
2015.09.10
С днем рождения ! 30 сентября 2014 вторник


2-1395359190
alexdn
2014-03-21 03:46
2015.09.10
ComboBox