[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