Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > не получается сделать RollBack


Автор: Corba 12.1.2006, 17:09
Вообщем реализовал след. конструкцию:

Код

lSaved:=True;
if cds1.ChangeCount>0 then
    begin
      dbxLio.StartTransaction( hTrans );
      with cds1 do
        try
          ApplyUpdates(0);
          dbxLio.Commit( hTrans );
        except
           dbxLio.Rollback( hTrans );
          lSaved := False;
        end; // with
    end;
//.......

If (lSaved) then ShowMessage('Всё ОК!')
else ShowMessage('Error!') ;


Я удивился, но except вызывается только когда Oracle не доступен, если же dbxLio.StartTransaction( hTrans ); прошёл, то даже ярые ошибки в SQL - скриптах не способны вызвать exception, при этом конечно же ничего в БД не сохраняется, но естественно выстреливает сообщение "Всё ОК!". Подскажите как мне правильно обработать ошибку, которая может возникнуть при неправильности скрипта. Заранее спасибо.
ЗЫ
Использую Delphi 7 & Oracle 9

Автор: <Spawn> 13.1.2006, 10:50
А что за компоненты используются?

Автор: Corba 13.1.2006, 11:42
используются компоненты dbexpress

Я уже сам нашёл решение заключается оно в следующем:
В обработчике BeforeUpdateRecord провайдера использую конструкцию:

Код

 try
//Sql запросы и другой код
Applied:=True;
except
    Applied:=False;
end;
...

При этом в случае успешного выполнения кода функция ApplyUpdates(0) вернёт 0 иначе значение больше 0, остаётся лишь сворганить условие.

Вот так приобразится код. В этом случае except отрабатывает без выкрутасов.
Код

if cds1.ChangeCount>0 then
    begin
      dbxLio.StartTransaction( hTrans );
      with cds1 do
        try
          if( ApplyUpdates(0) > 0 ) then
            Abort;
          dbxLio.Commit( hTrans );
        except
          dbxLio.Rollback( hTrans );
          lSaved := False;
        end; // with






Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)