[firebase-br] Erro TransactionID invalido!!

Kleber Caneva kdcc em terra.com.br
Sex Mar 30 11:17:21 -03 2007


A linha
      TransacaoSQL.TransactionID := IDTransacao; //1;
contradiz sua informação que " D transacao estou gerando o valor 
aleatoriamente"

Esse codigo sugere que você está usando Selec MAX
    DM.SQLUltimoCod.Close ;
    DM.SQLUltimoCod.Open  ;
   codigonovo := inttostr( DM.SQLUltimoCod.Fields[0].AsInteger + 1);

Substitua por GENERATOR, eles existem pra isso.

[]´s

Kléber Caneva


----- Original Message ----- 
From: "Pineli" <carlospineli em gmail.com>
To: <lista em firebase.com.br>; <pineli em ecp.com.br>
Sent: Friday, March 30, 2007 8:34 AM
Subject: [firebase-br] Erro TransactionID invalido!!


Ola para todos....
estou fazendo uma aplicacao com firebird 1.5 embarcado + delphi 7.
recebo centenas de eventos através de 1 sockets e preciso gravar tudo
no banco...
só que tudo acontece muito rápido e esta dando erro após a quinta
conexao. Qual uma maneira segura de gravar tudo com segurança... estou
fazendo assim:

tem um data modulo com a conexao
e cada conexao do socket cria uma thread com o codigo abaixo. Criando
um query tbm para cada.
O ID transacao estou gerando o valor aleatoriamente para tentar nao repetir
(...)

DM.SQLUltimoCod.Close ;
DM.SQLUltimoCod.Open  ;
codigonovo := inttostr( DM.SQLUltimoCod.Fields[0].AsInteger + 1);

//gravando informacao no banco de dados

SQLQueryThread.Close     ;  // Não sei se já tava aberta, então fecho
SQLQueryThread.SQL.Clear ;
SQLQueryThread.SQL.Add('INSERT INTO EVENTOS(ID_EVENTOS, EVENTO, IP) ');
SQLQueryThread.SQL.Add('VALUES('+CODIGONOVO+','+#39+COPY(RecText,1,4)+#39+','+#39+ClientSocket.RemoteAddress+#39+')')
;

Gravou := False;       // Controla se conseguiu ou não gravar
for i := 1 to 100 do   // Tentativa de gravação por 100 vezes
begin
    try
      TransacaoSQL.TransactionID := IDTransacao; //1;
      TransacaoSQL.IsolationLevel := xilREPEATABLEREAD ;
      DM.SQLConexao.StartTransaction( TransacaoSQL ) ;
      SQLQueryThread.ExecSQL( True ) ;
      DM.SQLConexao.Commit( TransacaoSQL ) ; // Efetiva gravação
      Gravou := True;   // Se chegou aqui é pq conseguiu gravar
    except
      on e:Exception do
      begin
         DM.SQLConexao.Rollback( TransacaoSQL ); // Desfaz alteraes
         Erro   := e.Message;
         Gravou := False    ;   // Faiô, tio!
      end;
    end;
    if Gravou then   // Conseguiu gravar, iupiiiii!
       break         // Sai do 'For'
    else
       Sleep(1000);  // Espera 1 segundo antes de ir p/ prox. passo do 'For'
end;
if not Gravou then   // Faiô mesmo, depois de 100 tentativas :-(
begin
   ShowMessage(Erro);   // Mostra mensagem de erro
(....)

quando ocorre o erro ele esgora as 100 tentativas....
Como fazer isso de uma forma mais segura??????

______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.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://firebase.com.br/pesquisa

Esta mensagem foi verificada pelo E-mail Protegido Terra.
Scan engine: McAfee VirusScan / Atualizado em 29/03/2007 / Versão: 
5.1.00/4995
Proteja o seu e-mail Terra: http://mail.terra.com.br/






Mais detalhes sobre a lista de discussão lista