Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Caros Amigos, preciso de uma ajudinha!!!...
Eu to querendo tratar um erro de exceção com o seguinte nome "EZSQLException"... este erro acontece quando eu tento deletar um cadastro de uma tabela pai sendo que esta contém filhos em outra tabela... entenderão? ... (eu utilizo o Zeos para conectar o banco de dados MYSQL)
Quando eu tento deletar um cadastro atravéz do DBNavigator ele detecta que este cadastro contém filhos e acusa um erro chamado EZSQLException... então eu quero tratá-lo!
pensei o seguinte:
procedure TFrmTeste.NavigatorClick(Sender: TObject; Button: TNavigateBtn);begin try if(nbDelete = Button) then // se o usuário precionar o butão delete ... Except on [color="#FF0000"]EZSQLException [/color]do ShowMessage(' .... '); end; end;end;só que aparece um erro de compilação Undeclared identifier: 'EZSQLException'....
Eu não sei direito fazer tratamento de erros, então eu preciso de uma ajuda pra solucionar este caso!!!... Vocês podem me ajudar?????
obrigado!!
Amigo Marcio.Theis, eu percebi uma coisa aqui que me deixou entrigado.... eu coloquei o tratamento de exceção corretamene desta vez, mas continuou acontecendo o erro!! aew eu percebi que quando eu clico no botão DELETAR do DBNavigator, ele surge uma menssagem de confirmação: DELETE RECORD? .... ou seja antes de entrar na procedure NavigatorClick ele executa essa menssagem e já efetua o error....COMO EU FARIA PRA TRATAR ESSE ERRO??grato.
Bom, não utilizo este componente, sempre uso botões com eventos criados... não sei muito bem como funciona o mesmo...
No caso poderia adicionar o componente TApplicationEvents, da paleta Additional, e no evento OnException fazer o tratamento, isso será atribuído então para todo o seu aplicativo de forma automática, precisando colocar o componente apenas no seu form principal...
Precisando somente fazer:
if E.ClassName = 'EZSQLException' then begin end;
Poo amigão... não está dando certo!! =/
a menssagem que dá, é a seguinte: "Project Teste.exe raized exception class EZSQLException with message 'SQL error:Cannot delete or update a parent row:......' "
eu fiz todos os procedimentos inserindo o TApplicationEvents no meu form principal e no OnException eu coloquei o código seguinte:
ShowMessage('tratamento de error!!'); if E.ClassName = 'EZSQLException' then begin ShowMessage('encontrou no error!!...!!'); // coloquei uma menssagem, apenas para verificar se entra aqui... end;
mas exibiu apena a menssagem "tratamento de error!!" depois da minha confirmação dos erros surgidos... =/
valeu..
Bom, roda passo a passo para ver a ClassName de retorno, ou então da um ShowMessage(E.ClassName), para saber qual é a classe do erro...
O nome da classe do error é: "EZDatabaseError"então o coloquei no if E.ClassName = 'EZDatabaseError' then....ele entrou na condição do erro, mas naum deixou de parar a execução da aplicação!!... tenho que fazer com que ele deixe de parar a execução do programa, aparecendo a menssagem de alerta ao usuário, para que não execute esse passo novamente!! entendeu???em Java... o tratamento de exceção bania o erro, não deixando-o acontecer.... e no delphi ele encontrou o error e naum o corrigiu alertando o usuário com a menssagem que coloquei...
Mas isto provavelmente é por causa deste componente que esta usando, se fizer tudo via botões, e você mesmo fazer o código de exclusão, provavelmente vai funcionar, pois o componente pode ter um try except que gera mensagem tb...
é verdade!!...vou tentar fazer com botões mesmo... assim eu posso tratar esse error!!valeu marcio pela pasciencia!!!abraços
tranqüilo, se puder dê um retorno depois se funcionou ou não... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif
oi marcio.theis.....
seguinte amigão, me responde a ultima duvida desse problema aew!!!
Tem como inibir uma exceção criada com uma cláusula ****raise??
O TApplicationEvents ele não deixa que a exceção execute o Debugger Exception Notification?? ele capta o error primeiro antes da exceção executar o Debugger??....
if (E is EDatabaseError) then begin case EZSQLException(E).ErrorCode of 1451: Application.MessageBox(PChar('Não é possível excluir este registro.'), 'Atenção !!!', MB_ICONEXCLAMATION); else ShowMessage(IntToStr( EZSQLException(E).ErrorCode)); end; end;
esse código corrige o erro que aparece após os Debugger Exception Notification... mas naum os evita!!!
flw
Me desculpe por ressuscitar um tópico tão antigo, mais eu to com um problema bem parecido
Só que eu to usando um arquivo ini para configurar a conexão com ZConnection , mais crio esse erro de propósito pra se num eventual problema no PC do meu cliente por acidente ele mudar alguma coisa sei lá, eu quero tratar esse erro mandando uma mensagem e e executando uma manutenção de Banco de dados.
segue o codigo
procedure TF_Principal.FormCreate(Sender: TObject);
begin
try
loadIni:=TIniFile.Create('Config.Ini');
with ZConnection1 do
begin
Database:=loadIni.ReadString('Config', 'DataBase','' );
HostName:=loadIni.ReadString('Config', 'HostName','' );
Password:=loadIni.ReadString('Config', 'Password','' );
Protocol:=loadIni.ReadString('Config', 'Protocolo','' );
User:=loadIni.ReadString('Config', 'Username', '');
Connected:=true;
end;
except
on E: Exception do
begin
if E.ClassName = 'EZSQLException' then
begin
ShowMessage('Eita coisa dificil');
end;
end;
end;
end;eu também não trabalho com o zeos, portanto, não posso garantir muita coisa, mas posso dizer para fazer como o MárcioTheis disse, verifique o nome da classe e trate a exception com o nome correto (para verificar, deixe o exception ocorrer sem tratamento)
Vai precisar mudar um pouco a forma de validação..
procedure TFrmTeste.NavigatorClick(Sender: TObject; Button: TNavigateBtn);begintryif(nbDelete = Button) then // se o usuário precionar o butão delete...except on E: Exception do begin if E.ClassName = 'EZSQLException' then begin end; end; end;end;
Ou seja, terá de pegar o nome da classe do erro e verificar por ele...