Duvida Try Except
Boa tarde Pessoal estou com uma dúvida na utilização de try except usando o dbexpress, principalmente na questão das excessões que parece que não entra... não sei se estou fazendo algo errado. Gostaria que me corrigissem se estiver fazendo.
Por exemplo numa alterações de informações de um cliente estou fazendo:
procedure Tclientes.Button1.Click;
var
t:ttransactiondesc;
begin
t.isolationlevel:= xilREADCOMMITTED;
try
sqlconnection1.startTransaction(t);
qrclientes.close;
qrclientes.sql.clear;
qrclientes.sql.text:='Update clientes set ENDERECO = :ender, NUM = :num where CODIGO = :cod';
qrclientes.parambyname('cod').asinteger:= 1;
qrclientes.parambyname('ender').asstring:= edit1.text;
qrclientes.parambyname('num').asinteger:= strtoint(edit2.text);
qrclientes.execsql;
sqlconnection1.commit(t);
except
sqlconnection1.rollback(t);
messagebox(handle,'Falha na atualização dos dados','Atenção',mb_ok);
A questão é qualquer errro gerado , seja por falha temporaria de conexão ao banco, ou por exemplo no campo NUM entrar com string(sem estar tratado no edit esse erro) ele bloquear... e dar o rollback e a msg de erro, porém isso não acontece retorna no exemplo de dados incompativeis a msg do proprio Mysql e não a excessão programada
Por exemplo numa alterações de informações de um cliente estou fazendo:
procedure Tclientes.Button1.Click;
var
t:ttransactiondesc;
begin
t.isolationlevel:= xilREADCOMMITTED;
try
sqlconnection1.startTransaction(t);
qrclientes.close;
qrclientes.sql.clear;
qrclientes.sql.text:='Update clientes set ENDERECO = :ender, NUM = :num where CODIGO = :cod';
qrclientes.parambyname('cod').asinteger:= 1;
qrclientes.parambyname('ender').asstring:= edit1.text;
qrclientes.parambyname('num').asinteger:= strtoint(edit2.text);
qrclientes.execsql;
sqlconnection1.commit(t);
except
sqlconnection1.rollback(t);
messagebox(handle,'Falha na atualização dos dados','Atenção',mb_ok);
A questão é qualquer errro gerado , seja por falha temporaria de conexão ao banco, ou por exemplo no campo NUM entrar com string(sem estar tratado no edit esse erro) ele bloquear... e dar o rollback e a msg de erro, porém isso não acontece retorna no exemplo de dados incompativeis a msg do proprio Mysql e não a excessão programada
Erick Ernits
Curtidas 0
Respostas
Claudia Nogueira
30/10/2012
Não achei nenhum erro no bloco try except não.
Qualquer problema no bloco, irá retornar a mensagem que você colocou na exceção.
Se você estiver testando por dentro do delphi, ou seja, compilando, vai mostrar dois erros, primeiro o erro propriamente dito e depois a mensagem personalizada.
Testou executando diretamente o exe por fora do Delphi?
Qualquer problema no bloco, irá retornar a mensagem que você colocou na exceção.
Se você estiver testando por dentro do delphi, ou seja, compilando, vai mostrar dois erros, primeiro o erro propriamente dito e depois a mensagem personalizada.
Testou executando diretamente o exe por fora do Delphi?
GOSTEI 0
Erick Ernits
30/10/2012
Boa tarde Claudia Executei o exe e o erro aparece do proprio banco não do exe !!
GOSTEI 0
Claudia Nogueira
30/10/2012
Realmente qualquer erro dentro do bloco era pra mostrar a mensagem personalizada.
Só se o problema estiver ocorrendo também quando executa o rollback, aí sim daria esse problema.
Uma solução seria colocar um except separado para o rollback:
Só se o problema estiver ocorrendo também quando executa o rollback, aí sim daria esse problema.
Uma solução seria colocar um except separado para o rollback:
try
sqlconnection1.startTransaction(t);
qrclientes.close;
qrclientes.sql.clear;
qrclientes.sql.text:='Update clientes set ENDERECO = :ender, NUM = :num where CODIGO = :cod';
qrclientes.parambyname('cod').asinteger:= 1;
qrclientes.parambyname('ender').asstring:= edit1.text;
qrclientes.parambyname('num').asinteger:= strtoint(edit2.text);
qrclientes.execsql;
sqlconnection1.commit(t);
except
try
sqlconnection1.rollback(t);
except
end;
messagebox(handle,'Falha na atualização dos dados','Atenção',mb_ok);
end;
Boa tarde Claudia Executei o exe e o erro aparece do proprio banco não do exe !!
GOSTEI 0
Alisson Santos
30/10/2012
Erik qual é o componente que está utilizando.
Caso seja o dbexpress, alguns erros são silenciosos que não mostra para você, ainda mais quando utiliza o try, except, o ideal verificar se vai retornar algum erro direto no provider dataset que é o componente que monta a select e passa para o banco de dados executar.
Caso seja o dbexpress, alguns erros são silenciosos que não mostra para você, ainda mais quando utiliza o try, except, o ideal verificar se vai retornar algum erro direto no provider dataset que é o componente que monta a select e passa para o banco de dados executar.
GOSTEI 0
Erick Ernits
30/10/2012
Erik qual é o componente que está utilizando.
Caso seja o dbexpress, alguns erros são silenciosos que não mostra para você, ainda mais quando utiliza o try, except, o ideal verificar se vai retornar algum erro direto no provider dataset que é o componente que monta a select e passa para o banco de dados executar.
Caso seja o dbexpress, alguns erros são silenciosos que não mostra para você, ainda mais quando utiliza o try, except, o ideal verificar se vai retornar algum erro direto no provider dataset que é o componente que monta a select e passa para o banco de dados executar.
Boa tarde Alisson,
Sim estou usando o dbexpress... teria como fazer isso direto pela query mesmo tratando dessa maneira ou algo semelhante ? Sem a necessidade de armazenar no dataset para depois atualizar no banco ?
Obrigado a todos pela atenção!!
GOSTEI 0