Форум: "Прочее";
Текущий архив: 2015.09.10;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.131 c