[firebase-br] Drive dbExpress

Pha-Lista lista em pha.com.br
Qui Maio 5 09:25:43 -03 2005


Eduardo,

Acho que isso nao seria um Erro e sim uma implementacao diferente, voce poderia por exemplo criar um metodo ou uma funcao que fizesse o Commit automatico.

Acredito que utilizando da forma natural ClientDataSet + DataSetProvider e SQLDataSet, este erro nao deve ocorrer, pois e o Provider que chama a transacao e o SQLDataSet que executa atravez dos metodos PSStartTransaction,  PSStartTransaction e PSInTransaction, voce pode ate criar um componente diferente e definir da forma que achar melhor, eu por exemplo, prefiria que a transacao das atualizacoes fosse diferente da principal.

Encontre nos fontes (SqlExpr.pas Delphi 6), um parametro que nao aparece nos params do SQLConnection, tente adiconar a seguinte linha em params 'AutoCommit=TRUE'.

PHA
Nova Odessa / SP - Brazil

-----Mensagem original-----
From: eduardo eduardo em icontroller.com.br
Date: Wed,  4 May 2005 20:56:24 -0300
To: lista em firebase.com.br
Subject: Re: [firebase-br] Drive dbExpress

> Pessoal
> 
> Fiz um pequeno Teste do que, no início do nosso projeto nos desencorajou 
> de uitlizar o Driver da UIB, juntamente com outros problemas menores que 
> sei que já foram corrigidos no Driver.
> Uma outra coisa que nos deixa inseguros de utilizar, é que o Autor não 
> dá mais informações sobre o andamento do Driver. O Histórico de 
> modificações e melhorias sempre se referem aos outros componentes UIB.
> 
> De qualquer forma, segue abaixo uma pequena rotina de testes que acabei 
> de fazer com a versão mais atual do Driver da UIB 2.0, que pode ser 
> reproduzido em qualquer lugar.
> 
> Fica nossa contribuição. Se alguém tiver mais alguma informação...
> 
> []'s Eduardo
> 
> /****************************************************************/
> procedure TData.DoTeste;
> var TD: TTransactionDesc;
>      procedure DoTeste1;
>      var i:integer;
>      begin
>           MainSrv.ExecuteDirect('RECREATE TABLE TESTE (CODIGO INTEGER 
> NOT NULL PRIMARY KEY)');
>           for i := 1 to 10 do
>               MainSrv.ExecuteDirect('INSERT INTO TESTE (CODIGO) 
> VALUES('+IntToStr(i)+')');
>      end;
> 
>      procedure DoTeste2;
>      var i:integer;
>      begin
>           TD.TransactionID  := 1;
>           TD.IsolationLevel := xilREADCOMMITTED;
> 
>           MainSrv.StartTransaction(TD);
>           MainSrv.ExecuteDirect('RECREATE TABLE TESTE (CODIGO INTEGER 
> NOT NULL PRIMARY KEY)');
>           MainSrv.Commit(TD);
> 
>           for i := 1 to 10 do
>               MainSrv.ExecuteDirect('INSERT INTO TESTE (CODIGO) 
> VALUES('+IntToStr(i)+')');
>      end;
> 
>      procedure DoTeste3;
>      var i:integer;
>      begin
>           MainSrv.ExecuteDirect('DELETE FROM TESTE');
>           for i := 1 to 10 do
>               begin
>                    if i = 9 then
>                       MainSrv.ExecuteDirect('INSERT INTO TESTE (CODIGO) 
> VALUES(NULL)') //Força Erro
>                    else
>                       MainSrv.ExecuteDirect('INSERT INTO TESTE (CODIGO) 
> VALUES('+IntToStr(i)+')');
>               end;
>      end;
> 
>      procedure DoTeste4;
>      var i:integer;
>      begin
>           TD.TransactionID  := 1;
>           TD.IsolationLevel := xilREADCOMMITTED;
> 
>           MainSrv.StartTransaction(TD);
>           MainSrv.ExecuteDirect('DELETE FROM TESTE');
>           MainSrv.Commit(TD);
> 
>           for i := 1 to 10 do
>               begin
>                    MainSrv.StartTransaction(TD);
>                       if i = 9 then
>                          MainSrv.ExecuteDirect('INSERT INTO TESTE 
> (CODIGO) VALUES(NULL)') //Força Erro
>                       else
>                          MainSrv.ExecuteDirect('INSERT INTO TESTE 
> (CODIGO) VALUES('+IntToStr(i)+')');
>                    MainSrv.Commit(TD);
>               end;
>      end;
> begin
>       // MainSrv é um TSQLConnection
>       // Os Testes abaixo demonstram o que postei sobre diferenças de
>       // comportamento entre o Driver da Borland e da UIB
> 
>       // Teste 1 - Criar tabela e em seguida inserir dados
>       // Com o driver da Borland ->OK
>       // Com o da UIB -> Erro TABLE DOES NOT EXISTS TESTE
> //DoTeste1;
> 
>       // Teste 2 - O mesmo do Teste 1, só que abrindo transaction antes
>       // Com o driver da Borland ->OK
>       // Com o da UIB -> OK
> //DoTeste2;
> 
>       // Teste 3 - Presupõe que a tabela TESTE já está criada
>       // Com o driver da Borland -> Insere até o 8 - se tratar a 
> exceção, pula o 9 e insere o 10
>       // Com o da UIB -> Se a tabela estiver vazia, não insere nada
>       //                 Se estiver populada com os 10 registros, 
> continua com os 10
>       //                 ou seja, foi dado RollBack em todo o Processo;
> //DoTeste3;
> 
>       // Teste 4 - mesmo do 3 com Transaction Manejada pela Aplicação
>       // Com o driver da Borland -> OK
>       // Com o da UIB -> OK
> //DoTeste4;
> 
> 
>       // CONCLUSÃO
>       // Para quem começou a trabalhar com o Driver da Borland e
>       // não tem o Ssitema estrurado para se preocupar com Transactions
>       // desta forma, o Driver da UIB pode trazer surpresas desagradáveis
>       // Acho legal o componente tentar otimizar as coisas com manejo
>       // transparente de Transactions, mas não encontrei uma maneira de
>       // interferir nesta caracterísitica - algum flag que eu pudesse
>       // evitar o RollBack, conforme o caso.
> 
>       // Não utilizamos ClientDataSets para edição direta de dados,
>       // talvez, para quem os utiliza com o trio CS/Provider/Query,
>       // seja possível interceptar o erro e manejar o comportamento
>       // adequado.
> end;
> 
> 
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.bavs.com.br
> Para editar sua configuração na lista, use o endereço http://mail.firebase.com.br/mailman/listinfo/lista_firebase.com.br
> Para consultar mensagens antigas: http://search.gmane.org/search.php?group=firebase





Mais detalhes sobre a lista de discussão lista