Oi Eduardo, Isso depende, porque o execsql e uma instrucao que ira gerar "gravacao" no banco essa "gravacao" ainda nao esta salva, quando inicio uma transacao comecamos a salvar essa "gravacao" identificando atraves da transacao ( id transaction ) depois termino de salvar dando um commit.
quando o Default Transaction = TACommit; sempre que um dataset for fechado ele vai dar um commit; se voce chamar uma transacao em seguida, vai dar erro, porque nao podemos iniciar transacoes em tabelas fechadas. no caso do nosso amigo que esta utilizando sqldatasets para as operacoes insert , delete, update e consulta, para dar um rollback utilizando o exemplo que passei seria assim try dataset1.close; Sqldataset1.commandtext := 'insert .....'; Sqldataset1.parambyname( ..... SqlDataSet.ExecSQL; MinhaTransacao.TransactionID := 1; MinhaTransacao.IsolationLevel := xilREPEATABLEREAD; SQLConnection.StartTransaction(Transacao) SQLConnection.Commit(Transacao); SqlDataSet.Close; Except on Exc:Exception do begin SQLConnection.Rollback(Transacao); MessageDlg('Erro:'+#10#10+Exc.Message,mtError,[mbOK],0); end; end; dessa forma temos tudo transacoes commit e rollback voltando ao assunto de compilar uma nova dll , se alguem tiver o delphi 7 por ai, tenta compilar novamente essa dll da UIB novamente para verificar se tiveram realmente melhorias ou nao volto a dizer que o driver que utilizo e o UIB trabalho com meus sistemas com o formato que coloquei acima com campos blob e esta tudo funcionando mas confesso que se tivesse grana hoje compraria o drive da crlab, testei o demo, e o muito bom um forte abarco a todos []s alineri --- Em delphi-br@yahoogrupos.com.br, "Eduardo Silva dos Santos" <[EMAIL PROTECTED]> escreveu > > >>>Faca o seguinte: > > >>> SQLDataSet1. CommandText := 'insert into table (codigo) values (1)'; > >>> SQLDataSet1. ExecSQL; > >>> StartTransaction; > >>> commit; > > Olá Alineri... Startar a transação depois de executar o comando não faz > sentido.. e se quiser fazer um rollback..?? > > 2008/5/30 alineri <[EMAIL PROTECTED]>: > > > Ola Luciano, > > > > Estou utilizando firebird 2.1 + dbexpress com o Driver da UIB > > E esta tudo funcionando perfeitamente, inclusive campos Blobs. > > > > Vamos aos seu problema primeiro. > > > > Realmente o seu codigo utilizando o driver do Interbase funciona Ok, a > > diferenca acredito que esta realmente na forma como ambos os drivers > > tratam as transacoes no dbexpress. > > > > Faca o seguinte: > > > > SQLDataSet1. CommandText := 'insert into table (codigo) values (1)'; > > SQLDataSet1. ExecSQL; > > StartTransaction; > > commit; > > > > basta voce startar a transacao apos o execsql e nao antes. > > > > essa foi a unica diferenca que encontrei dos drivers para IB e FB. > > > > Blobs funcionam normalmente com o drive da UIB > > > > Testa ai e verifica se vai funcionar. > > > > Em relacao ao close comitar esse problema nao sei como resolver > > principalmente se estiver setado no driver da UIB Default Transaction > > = TACommit, ele vai comitar assim que o close for chamado. > > > > a unica forma para evitar seria ao dar um open em uma consulta > > relalizar todos os procedimentos dentro das suas rotinas e ao termino > > da um close. > > > > um problema que estou tendo e para compilar a a dll da UIB > > http://www.progdigy.com/modules.php?name=UIB > > > > existe um pacote novo a UIB2.1 ( componente de acesso ) so que essa > > dll utiliza as implementacoes desse pacote de componentes que ja esta > > adaptado para firebird 2.x, entao acredito que eeses error devam estar > > corrigidos, o problema e que nao consigo compilar,utilizo o BDS 2006, > > e nao reconhece o tipo de dados DBINAME e OIDViewFields no BDS 2006 > > existe DBINAME32 e OIDViewField se altero no font a Dll e gerada > > normalmente mas nao funciona. > > > > Em alguns foruns ja verifiquei que a Dll consegue ser compilada sem > > problemas na versao 7 do Delphi que nao tenho no momento. Um detalhe > > antes de compilar o pacote da UIB e compilar a Dll e necessario > > instalar o pacote SynEdit disponivel no link abaixo > > > > http://sourceforge.net/project/downloading.php?group_id=3221&use_mirror=ufpr&filename=SynEdit-2_0_6.zip&75620534 > > > > quem sabe se com esse compilacao o problema de controle de transacao > > nao esta resolvido ? > > > > um forte abarco a todos > > > > []s > > alineri > > > > --- Em delphi-br@yahoogrupos.com.br <delphi-br%40yahoogrupos.com.br>, > > Luciano Calenzani Simões > > <simoesluciano@> escreveu > > > > > > Ninguém passou por este problema? > > > Alguém está usando FireBirs 2 com esse driver UIB FireBird15? > > > > > > Luciano Calenzani Simões > > > > > > > > > > > > > > > > > > ----- Mensagem original ---- > > > De: Luciano Calenzani Simões <simoesluciano@> > > > Para: delphi-br@yahoogrupos.com.br <delphi-br%40yahoogrupos.com.br> > > > Enviadas: Quinta-feira, 29 de Maio de 2008 19:39:41 > > > Assunto: [delphi-br] DBExpress x FireBird 2 x UIB FireBird15 > > > > > > > > > O UIB FireBird15 para DBExpress com FireBird 2 tem problemas no > > gerenciamento de transação. Além daquele do campo BLOB já relatado > > nesta lista. > > > > > > Explico: Se dentro do contexto da transação tiver um > > SQLDataSet/SQLQuery /... fazendo um select em uma tabela, ao executar > > o SQLDataSet.Close ele" commita" a transação, e continua o > > procedimento normalmente. Se ocorrer algum erro após esse > > SQLDataSet.Close, as operações de I/O que foram feitas no início não > > serão desfeitas, mesmo sendo executado o RoolBack. Não deve estar > > acreditando, na hora eu também não acreditei. > > > > > > Fiz um teste com o mesmo código com o dirver Interbase e funciona > > perfeitamente. Mas esse driver não funciona perfeitamente com o > > FireBird 2. > > > Isso só acontece com operação de SELECT, se dentro da transação só > > tiver INSERT, UPDATE e DELETE irá funcionar perfeitamente. > > > > > > Código exemplo (síntese): > > > > > > begin > > > ... > > > StartTransaction; > > > try > > > SQLDataSet1. CommandText := 'insert into table (codigo) values (1)'; > > > SQLDataSet1. ExecSQL; > > > SQLDataSet1. Close; > > > > > > SQLDataSet1. CommandText := 'select * from table'; > > > SQLDataSet1. Open; > > > SQLDataSet1. Close; // Aqui ele comita a transação automaticamente. > > > > > > // Quando chegar aqui, o 1º insert já está comitado, se houver erro > > daqui para frente ele não será desfeito. > > > SQLDataSet1. CommandText := 'insert into table (codigo) values (2)'; > > > SQLDataSet1. ExecSQL; > > > SQLDataSet1. Close; > > > > > > CommitWork; > > > except > > > RollBack; > > > end; > > > end; > > > > > > Luciano Calenzani Simões > > > > > > > > > > > > Abra sua conta no Yahoo! Mail, o único sem limite de espaço > > para armazenamento! > > > http://br.mail.yahoo.com/ > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > > > -- > ....................................................... > Eduardo Silva dos Santos > DRD Sistemas. > (27) 3218-4201 > MSN: [EMAIL PROTECTED] > Site: http://www.drdsistemas.com.br/ > ....................................................... > > > [As partes desta mensagem que não continham texto foram removidas] >