PAGUE 6 MESES
LEVE 12 MESES
GARANTIR DESCONTO

Fórum Stored procedure e rollback #387298

27/09/2010

0

Bom dia,

Estou com um problema para desfazer as operações realizadas no banco de dados (Delphi 7 com Firebird 2.1 e dbexpress). Em uma rotina utilizo um componente clientdatase e uma stored procedure para gravar alguns dados no banco. Entretando, quando simulo um erro, o primeiro registro inserido pela SP não é desfeito. Segue abaixo o código utilizado.


var
  SQLTrans: TTransactionDesc;

...

   try
      SQLTrans.IsolationLevel := xilREADCOMMITTED;
      SQLTrans.TransactionID := 1;


      SQLConnection.StartTransaction(SQLTrans);

      // inclui um registro pelo clientdataset
      ClientDataSet1.Append;
      ...
      ClientDataSet1.Post;

      // inclui 1º registro atraves de uma SP
      SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;
      SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;
      ...
      SQLStoredProc1.ExecProc;
   
      // inclui 2º registro atraves de uma SP
      SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;
      SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;
      ...
      SQLStoredProc1.ExecProc;

   

      // erro simulado
      raise Exception.Create('Erro teste de rollback');


     
if ClientDataSet1.ApplyUpdates(0) > 0 then
         raise Exception.Create('Erro na atualização do cds');

      SQLConnection.Commit(SQLTrans);

   except
      on E: Exception do
         begin
            ClientDataSet1.CancelUpdates;

            SQLConnection.Rollback(SQLTrans);



            ShowMessage(E.Message);
         end;

   end;



E também não é desfeita a inclusão do 1º registro se utilizar somente a stored procedure conforme abaixo.



var

  SQLTrans: TTransactionDesc;



...



   try

      SQLTrans.IsolationLevel := xilREADCOMMITTED;

      SQLTrans.TransactionID := 1;




      SQLConnection.StartTransaction(SQLTrans);



      // inclui 1º registro atraves de uma SP

      SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;

      SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;

      ...

      SQLStoredProc1.ExecProc;

   

      // inclui 2º registro atraves de uma SP

      SQLStoredProc1.Params.ParamByName('Campo1').Value := valor1;

      SQLStoredProc1.Params.ParamByName('Campo2').Value := valor2;

      ...

      SQLStoredProc1.ExecProc;


   



      // erro simulado

      raise Exception.Create('Erro teste de rollback');




      SQLConnection.Commit(SQLTrans);



   except

      on E: Exception do

         begin

            SQLConnection.Rollback(SQLTrans);





            ShowMessage(E.Message);

         end;



   end;



Luiz Bertolazzi

Luiz Bertolazzi

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar