[firebase-br] Transações & Driver UIBDBExp12Win32

Rodrigo Schiavo schiavor em uol.com.br
Qui Jan 27 01:52:12 -03 2005


    Olá amigos.

    Hoje resolvi um problema de validações de dados usando uma transação 
e uma coisa muito incomum ocorreu.

    No meu projeto de teste estava utilizando DBExpress com driver 
Interbase e banco de dados Firebird, tudo funcionou corretamente. Porém 
ao implementar a solução em meu projeto principal que também utiliza 
DBExpress e banco Firebird mas os drivers são da UIB quando era gerada 
uma exceção a mesma transação não efetuava o Rollback dos dados 
permitindo que inconsistências fossem geradas.

    Só consegui resolver este problema mudando o driver do meu projeto 
principal para Interbase o que não é aconselhavel uma vez que este 
driver não é mais 100% compativel com Firebird, alguém ja passou por isso?

    Abaixo segue a configuração dos componentes e a rotina que estava 
sendo utilizada:

    CONEXAO UTILIZANDO DRIVER INTERBASE
    conBase: TSQLConnection
    ConnectionName = 'IBConnection'
    DriverName = 'Interbase'
    GetDriverFunc = 'getSQLDriverINTERBASE'
    LibraryName = 'dbexpint.dll'
    LoginPrompt = False
    Params.Strings = (
      'DriverName=Interbase'
      'Database=Teste.fdb'
      'RoleName=RoleName'
      'User_Name=sysdba'
      'Password=masterkey'
      'ServerCharSet='
      'SQLDialect=3'
      'ErrorResourceFile='
      'LocaleCode=0000'
      'BlobSize=-1'
      'CommitRetain=False'
      'WaitOnLocks=True'
      'Interbase TransIsolation=ReadCommited'
      'Trim Char=False')
    VendorLib = 'gds32.dll'

  CONEXAO UTILIZANDO DRIVER UIB
conBase: TSQLConnection
    ConnectionName = 'UIB FireBird15 Connection'
    DriverName = 'UIB FireBird15'
    GetDriverFunc = 'getSQLDriverINTERBASE'
    LibraryName = 'dbexpUIBfire15.dll'
    LoginPrompt = False
    Params.Strings = (
      'BlobSize=-1'
      'CommitRetain=False'
      'Database=database.fdb'
      'DriverName=UIB FireBird15'
      'ErrorResourceFile='
      'LocaleCode=0000'
      'Password=masterkey'
      'RoleName=RoleName'
      'ServerCharSet='
      'SQLDialect=3'
      'Interbase TransIsolation=ReadCommited'
      'User_Name=SYSDBA'
      'WaitOnLocks=True')
    VendorLib = 'fbclient.dll'



PROCEDIMENTO
procedure TForm1.Gravar(var cds: TClientDataSet);
var
  TD: TTransactionDesc;
begin
  Application.ProcessMessages;
  if not (cds.State in [dsInsert, dsEdit]) then Exit;
  TD.TransactionID := 1;
  TD.IsolationLevel := xilREADCOMMITTED;
  conBase.StartTransaction(TD);
  try
    cds.Post;
    cds.ApplyUpdates(0);
    conBase.Commit(TD);
  except
    conBase.Rollback(TD); >>>>>>>>>>>>>>>>>> ESTE ROLLBACK NÃO É 
EXECUTADO COM DRIVER UIB
    cds.Edit;
    raise;
  end;
end;





Mais detalhes sobre a lista de discussão lista