Dbexpress - Transações ID

Delphi

31/07/2006

Estou com um problema de Duplicate Transaction ID, contudo sei que este problema acontece quando uma ID está aberta e outra com o mesmo número está tentando realizar uma transação(Insert,Update ou Delete).

Então fiquei com dúvida se a minha forma de trabalhar com as transações está deixando o ID em aberto.

Abaixo um exemplo do código que utilizo para inserir atualizar e excluir,caso existam erros por favor me ajude a corrigi-los.

Insert

TD.TransactionID:=1;
TD.IsolationLevel:=xilREADCOMMITTED;
Dm.Database.StartTransaction(TD);
Dm.Qry_Sql.Close;
Dm.Qry_Sql.CommandText:=
´INSERT INTO TESTE´+#13+
´(TESTE) ´+13+
´VALUES ´+13+
´ (:Teste)´;
Dm.Qry_Sql.ParamByName(´Teste´).AsString:=Trim(Edt_Teste.Text);
Dm.Qry_Sql.ExecSQL;
Dm.Database.Commit(TD);


Update

TD.TransactionID:=2;
TD.IsolationLevel:=xilREADCOMMITTED;
Dm.Database.StartTransaction(TD);
Dm.Qry_Sql.Close;
Dm.Qry_Sql.CommandText:=
´ UPDATE TESTE SET ´+#13+
´ TESTE =:Teste,´+13+
´ REGISTRO_TESTE =:Registro_Teste ´+13+
´ WHERE REGISTRO_TESTE=:REGISTRO_TESTE ´;
Dm.Qry_Sql.ParamByName(´Teste´).AsString:=Trim(Edt_Teste.Text);
Dm.Qry_Sql.ParamByName(´Registro_Teste´).AsInteger:=Dm.CD_TesteREGISTRO_Teste.AsInteger;
Dm.Qry_Sql.ExecSQL;
Dm.Database.Commit(TD);


Excluir

TD.TransactionID:=3;
TD.IsolationLevel:=xilREADCOMMITTED;
Dm.Database.StartTransaction(TD);
Dm.Qry_Teste.Close;
Dm.Qry_Teste.CommandText:=´DELETE FROM Teste WHERE REGISTRO_Teste=:REGISTRO_Teste´;
Dm.Qry_Teste.ParamByName(´Registro_Teste´).AsInteger:=Dm.Qry_Teste.ParamByName(´Registro_Teste´).AsInteger;
Dm.Qry_Teste.ExecSQL;
Dm.CD_Teste.Delete;
Dm.CD_Teste.ApplyUpdates(-1);
Dm.Database.Commit(TD);


Obs: Gostaria de saber tambem se existe uma forma de verificar se existe um ID em aberto antes da realização de uma nova transação.


Desde já agradeço a atenção de Todos.


Lnunes

Lnunes

Curtidas 0

Respostas

Jáder Medeiros

Jáder Medeiros

31/07/2006

A propriedade InTransaction da classe TSQLConnection informa se existe alguma transação em aberto.

Toda transação de banco de dados DEVE estar dentro de um tratamento de exceção. Esse foi o seu erro. Ex:
TD.TransactionID:= 1;
TD.IsolationLevel := xilREADCOMMITTED;
Dm.Database.StartTransaction(TD);
try
Dm.Qry_Sql.Close;
Dm.Qry_Sql.CommandText := ´INSERT INTO TESTE´#13´(TESTE)´13´VALUES ´13´ (:Teste)´;
Dm.Qry_Sql.ParamByName(´Teste´).AsString := Trim(Edt_Teste.Text);
Dm.Qry_Sql.ExecSQL;
Dm.Database.Commit(TD)
except
Dm.Database.Rollback(TD)
end


Caso você ainda encontre problemas com transação, detalhe melhor o erro informado.


GOSTEI 0
Jáder Medeiros

Jáder Medeiros

31/07/2006

A propriedade InTransaction da classe TSQLConnection informa se existe alguma transação em aberto.

Toda transação de banco de dados DEVE estar dentro de um tratamento de exceção. Esse foi o seu erro. Ex:
TD.TransactionID:= 1;
TD.IsolationLevel := xilREADCOMMITTED;
Dm.Database.StartTransaction(TD);
try
Dm.Qry_Sql.Close;
Dm.Qry_Sql.CommandText := ´INSERT INTO TESTE´#13´(TESTE)´13´VALUES ´13´ (:Teste)´;
Dm.Qry_Sql.ParamByName(´Teste´).AsString := Trim(Edt_Teste.Text);
Dm.Qry_Sql.ExecSQL;
Dm.Database.Commit(TD)
except
Dm.Database.Rollback(TD)
end


Caso você ainda encontre problemas com transação, detalhe melhor o erro informado.


GOSTEI 0
Adriano Santos

Adriano Santos

31/07/2006

Vale dar uma boa lida também [url=http://forum.clubedelphi.net/viewtopic.php?t=58547&highlight=sqldataset+++clientdataset]neste tópico[/url].


GOSTEI 0
Lnunes

Lnunes

31/07/2006

Jáder muito obrigado pela ajuda, mas verdade o meu código já tem tratamento de exceção foi que na hora de exemplificar acabei não colocando
o código completo.

Contudo como o restante do código está correto então fico mais tranquilo.


Agradeço a atenção de todos.


GOSTEI 0
POSTAR