[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