Dbexpress - Transações ID
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.
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
Curtidas 0
Respostas
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:
Caso você ainda encontre problemas com transação, detalhe melhor o erro informado.
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
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:
Caso você ainda encontre problemas com transação, detalhe melhor o erro informado.
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
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
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.
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