[firebase-br] Drive dbExpress

eduardo eduardo em icontroller.com.br
Qua Maio 4 21:02:43 -03 2005


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;





Mais detalhes sobre a lista de discussão lista