Запрос с работой транзакции
Запрос с работой транзакции
Привет,
Мне нужно организовать проверку выполнения команд в транзакции, вида:
start transaction
update mytable set oklad=oklad+1000
update mytab set nalog=nalog+(nalog/0.03)
........
.........
if ошибка then rollback else commit
-------------
В общем мне нужен вид запроса проверки на ошибку и откат данных или применение, типа:
if error<>0 then .....
Мне нужно организовать проверку выполнения команд в транзакции, вида:
start transaction
update mytable set oklad=oklad+1000
update mytab set nalog=nalog+(nalog/0.03)
........
.........
if ошибка then rollback else commit
-------------
В общем мне нужен вид запроса проверки на ошибку и откат данных или применение, типа:
if error<>0 then .....
непонятно, в чем проблема. если ты хочешь сделать это на сервере, то это неправильно - транзакции стартуют и завершаются клиентом.
если оба запроса загнать в процедуру, то и обрабатывать ничего не надо. При обломе на любом операторе внутри процедуры автоматически отменится все, что успело выполниться в процедуре.
Код: Выделить всё
TR.StartTransaction
try
SQL1.ExecQuery;
SQL2.ExecQuery;
except
TR.Rollback;
end.
if TR.Active then TR.Commit;
это, грубо говоря, оператор ISQL. или embedded SQL. В сервере его нет.тогда зачем нуже
SET TRANSACTION?
нет записи - проверяется по rowsaffected например. да и сам датасет это и проверяет, и выдает ошибку уже не серверную, а клиентскую.ожидаемый трабл какой нить. например ну нет такой записи
В общем, разберись с исключениями в Pascal

Последний раз редактировалось kdv 01 сен 2006, 12:57, всего редактировалось 1 раз.
http://www.ibase.ru/devinfo/ibtrans.htmaXis писал(а):тогда зачем нуже SET TRANSACTION?
Вырезка из статьи:
Как вы поняли, это синтаксис Embedded SQL. Т.е. "запихнуть" такой оператор в компонент Query не получится. Однако объяснять такой синтаксис проще, чем набор сухих констант из API Guide. Поэтому объяснение синтаксиса пойдет параллельно с константами.
Для этого есть механизм пользовательских исключений, а также механизм событий.aXis писал(а):Да и облом может быть разный
ожидаемый трабл какой нить. например ну нет такой записи
В общем, идите и читайте книжки.
язык c#. использую ado.net. причем тут еще какой то датасет.kdv писал(а):это, грубо говоря, оператор ISQL. или embedded SQL. В сервере его нет.тогда зачем нуже
SET TRANSACTION?
нет записи - проверяется по rowsaffected например. да и сам датасет это и проверяет, и выдает ошибку уже не серверную, а клиентскую.ожидаемый трабл какой нить. например ну нет такой записи
В общем, разберись с исключениями в Pascal
делфи увы не знаю.
а если процедура большая. ну очень большая. и врдруг не обязательно чтобы она все откатывалась. а это как я понял делается клиентом. то есть либо все коммит либо все ролбэк. просто в mssql этого вопроса как то не возникало.
а зачем тогда и в ibx и в ems в подсказке есть слово TTRANSACTION?Как вы поняли, это синтаксис Embedded SQL. Т.е. "запихнуть" такой оператор в компонент Query не получится. Однако объяснять такой синтаксис проще, чем набор сухих констант из API Guide. Поэтому объяснение синтаксиса пойдет параллельно с константами.
если в них запихнуть нельзя?
я просто хочу вызвать хранимую процедуру с параметрами. И зачем мне создавать dataset или тем более datatable. FW 2Ну как какой. Класс таблицы данных в Delphi. В FW 1.1 к нему наиболее близок DataTable.
в адо.нет есть 2 варианта такой работы ( пример mssql)
1) как обычно сделать процедуру
Код: Выделить всё
create proc name ....
as
...
Start transaction
...
if(...) then commit
else
rollback
Код: Выделить всё
FbConnection con=new FbConnection();
FbTransaction tran=con.BeginTransaction();
Fbcommand cmd=new Fbcommand(query);
...
cmd.Transaction=tran;
try{
cmd.ExecuteNonQuery();
tran.Commit();
}
catch(FbException){
tran.Rollback();
}
в firebird видимо 1 вариант нереален. только второй
ну а что делать если реально процедура заумная и нужно несколько раз бы сделать commit внутри ее?
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05