Erro - Invalid Transaction Handle

Firebird

27/09/2005

olá,

Um cliente me ligou informando que ao chegar ao servidor viu as seguintes telas de erros:

“Invalid Transaction Handle”

“Expecting Transaction Start”

“Attached reclosed cursor”

Apesar de tudo o programa continuou rodando normalmente.

Alguém sabe quando ou porque isto acontece.

Valeu.


Marcelo.l

Marcelo.l

Curtidas 0

Respostas

Rodolpho123

Rodolpho123

27/09/2005

Verifique se isso ocorre com frequencia e se for, só debugando o seu sistema....


GOSTEI 0
Marcelo.l

Marcelo.l

27/09/2005

Olá, Rodolpho

Na verdade o programa ja roda a quase um ano
e é a primeira vez que me informam esta mensagem de erro.

Vc sabe porque ela pode ocorrer?


GOSTEI 0
Mordred

Mordred

27/09/2005

Eu também tô me lascando com esse problema. Tenho um datamodule e tenho um form. No datamodule tenho um database e uma transaction. No form tenho uma query. No evento onshow do form altero a propriedade SQL da query e quando mando ela abrir ela dá esse erro escroto aí. Não sei se ajuda, mas este é o meu código:

Procedure ListaPDV;
Begin
  frmMovCaixa.Query.Close;
  frmMovCaixa.Query.SQL.Clear;
   frmMovCaixa.Query.SQL.Add(´SELECT DISTINCT PDV FROM CAIXA ORDER BY PDV´);
  frmMovCaixa.Query.Open;

  frmMovCaixa.Query.First;
  frmMovCaixa.cmbPDV.Items.Clear;
  frmMovCaixa.cmbPDV.Items.Add(´Todos´);
  While Not frmMovCaixa.Query.Eof Do
    Begin
      frmMovCaixa.cmbPDV.Items.Add(frmMovCaixa.Query.Fields[0].AsString);
      frmMovCaixa.Query.Next;
    End;
End;


O erro acontece na 6ª linha ( frmMovCaixa.Query.Open;)
Será que ninguém aqui passou por isso acontecer antes???


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

27/09/2005

qual o banco de dados utilizado? quais os componentes utilizados para acesso ao banco de dados?

antes de efetuar quaisquer procedimentos de consulta/inserção, verifique se não há transações abertas.
1. se houver transações abertas, tente ´comitá-las´ (em caso de erro faça um rollback)
2. abra uma nova transação.
3. efetue os procedimentos necessários.
4. tente ´comitar´ a transação (em caso de erro faça um rollback)

por exemplo (supondo que nesse momento não deveria ter qualquer transação aberta):
Procedure ListaPDV; 
Begin 
  if frmMovCaixa.Query.SQLConnection.InTransaction then
    try
      frmMovCaixa.Query.SQLConnection.Commit;
    except
      frmMovCaixa.Query.SQLConnection.RollBack;
    end;

  frmMovCaixa.Query.Close; 
  frmMovCaixa.Query.SQL.Clear; 
  frmMovCaixa.Query.SQL.Add(´SELECT DISTINCT PDV FROM CAIXA ORDER BY PDV´); 
  frmMovCaixa.Query.Open; 

  frmMovCaixa.Query.First; 
  frmMovCaixa.cmbPDV.Items.Clear; 
  frmMovCaixa.cmbPDV.Items.Add(´Todos´); 
  while Not frmMovCaixa.Query.Eof Do 
  Begin 
    frmMovCaixa.cmbPDV.Items.Add(frmMovCaixa.Query.Fields[0].AsString); 
    frmMovCaixa.Query.Next; 
  End;
End


se fosse num procedimento de inclusão/manipulação de dados:
Procedure GravaPDV; 
Begin 
  if SQLConnection.InTransaction then
    try
      SQLConnection.Commit;
    except
      SQLConnection.RollBack;
    end;
  
  SQLConnection.StartTransaction;

  try
    {procedimento para manipulação do estoque}

    {procedimento para gravação do PDV em si}

    {procedimento para alterações estatísticas do cliente}

    {procedimento para alterações dos acumulados de vendas}

    SQLConnection.Commit;
  except
    SQLConnection.RollBack;
    {Exibe mensagem de erro}
  end;
End



GOSTEI 0
Mordred

Mordred

27/09/2005

Valeu Emerson. Agora entendi melhor, o caso é bem esse que você falou aí.
Mas como meu caso era bem mais simples e não envolvia alteração de dados, já consegui resolver aqui. Simplesmente deixei em branco a propriedade Transaction da Query e beleza, funcionou. Mas a alternativa que você passou aí é bem interessante para casos mais complicados.

Valeu mesmo. XD


GOSTEI 0
Martins

Martins

27/09/2005

qual o banco de dados utilizado? quais os componentes utilizados para acesso ao banco de dados? antes de efetuar quaisquer procedimentos de consulta/inserção, verifique se não há transações abertas. 1. se houver transações abertas, tente ´comitá-las´ (em caso de erro faça um rollback) 2. abra uma nova transação. 3. efetue os procedimentos necessários. 4. tente ´comitar´ a transação (em caso de erro faça um rollback) por exemplo (supondo que nesse momento não deveria ter qualquer transação aberta):
Procedure ListaPDV; 
Begin 
  if frmMovCaixa.Query.SQLConnection.InTransaction then
    try
      frmMovCaixa.Query.SQLConnection.Commit;
    except
      frmMovCaixa.Query.SQLConnection.RollBack;
    end;

  frmMovCaixa.Query.Close; 
  frmMovCaixa.Query.SQL.Clear; 
  frmMovCaixa.Query.SQL.Add(´SELECT DISTINCT PDV FROM CAIXA ORDER BY PDV´); 
  frmMovCaixa.Query.Open; 

  frmMovCaixa.Query.First; 
  frmMovCaixa.cmbPDV.Items.Clear; 
  frmMovCaixa.cmbPDV.Items.Add(´Todos´); 
  while Not frmMovCaixa.Query.Eof Do 
  Begin 
    frmMovCaixa.cmbPDV.Items.Add(frmMovCaixa.Query.Fields[0].AsString); 
    frmMovCaixa.Query.Next; 
  End;
End
se fosse num procedimento de inclusão/manipulação de dados:
Procedure GravaPDV; 
Begin 
  if SQLConnection.InTransaction then
    try
      SQLConnection.Commit;
    except
      SQLConnection.RollBack;
    end;
  
  SQLConnection.StartTransaction;

  try
    {procedimento para manipulação do estoque}

    {procedimento para gravação do PDV em si}

    {procedimento para alterações estatísticas do cliente}

    {procedimento para alterações dos acumulados de vendas}

    SQLConnection.Commit;
  except
    SQLConnection.RollBack;
    {Exibe mensagem de erro}
  end;
End


Uma solução profissional para uma questão complicada, boa [b:f13dea5f6d]Emerson.en[/b:f13dea5f6d].

Blz!!!


GOSTEI 0
POSTAR