try except
Olá,
estou tentando usar exceções para tratar erros no banco de dados Mysql.
Usando o código abaixo, quando ocorre um erro em ApplyUpdates,
aparece uma mensagem de erro do banco (por exemplo, key violation. [MySQL ....).
try
dm.QueryPeriodico.Post;
dm.dbBanco.ApplyUpdates([dm.QueryPeriodico]);
except
on EDBEngineError do
ShowMessage(´Alteração não permitida.´);
end;
Quando ocorre erro no ApplyUpdates, o fluxo do programa não deveria ser desviado para except?
Aqui não está ocorrendo isso. Só mostra a mesagem do Banco de dados nunca mostra o meu ShowMessage (´Alteração não permitida´).
Como vcs tratam as mesagens de erro do Banco?
Obrigado por qualquer ajuda
[ ]´s
Paulo
estou tentando usar exceções para tratar erros no banco de dados Mysql.
Usando o código abaixo, quando ocorre um erro em ApplyUpdates,
aparece uma mensagem de erro do banco (por exemplo, key violation. [MySQL ....).
try
dm.QueryPeriodico.Post;
dm.dbBanco.ApplyUpdates([dm.QueryPeriodico]);
except
on EDBEngineError do
ShowMessage(´Alteração não permitida.´);
end;
Quando ocorre erro no ApplyUpdates, o fluxo do programa não deveria ser desviado para except?
Aqui não está ocorrendo isso. Só mostra a mesagem do Banco de dados nunca mostra o meu ShowMessage (´Alteração não permitida´).
Como vcs tratam as mesagens de erro do Banco?
Obrigado por qualquer ajuda
[ ]´s
Paulo
Paulososi
Curtidas 0
Respostas
Cebikyn
18/07/2003
Não endento muito do assunto, mas sugiro que você tire a linha de código [b:a3e520dcaf]on EDBEngineError do[/b:a3e520dcaf] e tente novamente...
GOSTEI 0
Allan
18/07/2003
Eu nesse caso eu uso o evento OnReconcileError, e lá eu trato o erro .
Tipo :
if E.ErrorCode = 9729 then
begin
ShowMessage(´Erro de Key Violation´) ;
Abort;
end ;
Pra vc usar essa sua estrutura no se datamodulo vc deve ter um DataBase , e abrir uma seção :
dm.Database1.StartTransaction;
try
dm.QueryPeriodico.Post;
dm.dbBanco.ApplyUpdates([dm.QueryPeriodico]);
dm.Database1.Commit;
except
on EDBEngineError do
dm.Database1.Rollback;
ShowMessage(´Alteração não permitida.´);
end;
Deve funcionar ...
Allan
Tipo :
if E.ErrorCode = 9729 then
begin
ShowMessage(´Erro de Key Violation´) ;
Abort;
end ;
Pra vc usar essa sua estrutura no se datamodulo vc deve ter um DataBase , e abrir uma seção :
dm.Database1.StartTransaction;
try
dm.QueryPeriodico.Post;
dm.dbBanco.ApplyUpdates([dm.QueryPeriodico]);
dm.Database1.Commit;
except
on EDBEngineError do
dm.Database1.Rollback;
ShowMessage(´Alteração não permitida.´);
end;
Deve funcionar ...
Allan
GOSTEI 0
Cebikyn
18/07/2003
Eu ainda acho que tirar a linha de código que eu indiquei é mais eficiente, uma vez que somente um erro é esperado, o [b:54757ba8bb]on[/b:54757ba8bb]...[b:54757ba8bb]do[/b:54757ba8bb] só deve ser usado em ocasiões em que diversos erros diferentes podem acontecer e deseja-se dar a cada um deles um tratamento especial, logo se você espera somente um tipo de erro é mais seguro não usar este recurso, pois você cai em problemas como o que originou este tópico. Por outro lado, usando o recurso, você sabe exatamente o que aconteceu de errado, mas na dúvida é melhor não usar.
GOSTEI 0
Cebikyn
18/07/2003
Mais um detalhe:
´Erro de Key Violation´ não diz muito para um usuário comum...
if E.ErrorCode = 9729 then
begin
ShowMessage(´Erro de Key Violation´) ;
Abort;
end;
´Erro de Key Violation´ não diz muito para um usuário comum...
GOSTEI 0