[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