Turbo Postado Junho 29, 2004 Denunciar Share Postado Junho 29, 2004 fala galera, o problema é : quero fazer uma função que trate os erros mais comuns de banco de dados.porque estou tratando todos de uma unica forma, como exception, e dando uma mensagem generica....como faço para criar uma função que trate os erros de BD, tipo Access Violation, Violation Key....espero ajuda c possivel....vlw.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 1, 2004 Denunciar Share Postado Julho 1, 2004 Você usa BDE para acessar seu banco de dados? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 1, 2004 Denunciar Share Postado Julho 1, 2004 Você usa BDE para acessar seu banco de dados? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Turbo Postado Julho 1, 2004 Autor Denunciar Share Postado Julho 1, 2004 uso.... Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 1, 2004 Denunciar Share Postado Julho 1, 2004 Beleza... Até à noite eu posto alguns comentários aqui. Estou sem o Delphi no momento. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Alessandro Postado Julho 1, 2004 Denunciar Share Postado Julho 1, 2004 Inclua a unit DBITYPES na clausula uses do seu form.procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);beginif EDBEngineError(E).Errors[0].ErrorCode = 9729 thenShowMessage('Registro já existe!');Action:= daAbort;end; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 1, 2004 Denunciar Share Postado Julho 1, 2004 Bem, deve-se manipular exceções com o o objetivo de tratar erros de execução e proteger recursos.Os comandos geralmente utilizados são TRY...EXCEPT e TRY...FINALLY. O TRY...EXCEPT você já está usando. o TRY...FINALLY funciona da seguinte maneira: todas as instruções devem ser colocadas dentro do bloco TRY e a instrução ou, as instruções que, em hipótese alguma, podem deixar de ser executadas, devem ser colocadas no bloco FINALLY. Em outros termos, não importa o que aconteça no bloco TRY, as instruções dentro do FINALLY sempre serão executadas.Sintaxe:==============Try <instrução>;Finally <instrução>;end;==============Bem, estes comentários iniciais certamente já são de seu conhecimento.As exceções que são geradas através de banco de dados são tratadas de forma um pouco distinta das exceções "normais". A principal diferença está na utilização da classe 'EDatabaseError', que é a classe mais alta das exceções de banco de dados do Delphi, ou seja, todas as exceções de banco de dados do Delphi são derivadas desta classe. Logo, teremos outras classes abaixo de EDatabaseError.Veja um exemplo:===================================Try Table1.Post;Except On EDatabaseError do ShowMessage('Não foi possível gravar o registro!'); Raise;end;===================================Obs.: A palavra reservada RAISE, utilizada no exemplo acima, de um modo geral, possui duas utilidades: 1) pode ser usada para gerar novamente uma exceção que já tenha sido manipulada, visto que, uma vez tratada, a exceção é destruída; 2) utilizada para gerar manualmente uma exceção, simulando uma condição de erro (v.g., "RAISE Exception.Create ('Mensagem para o usuário!');").Voltando ao assunto, o grande problema de seu utilizar a classe de exceção 'EDatabaseError' é que ela não especifica que tipo de exceção ocorreu, somente retorna um erro genérico qualquer. Para contornar este problema, podemos utilizar a classe EDBEngineError para obter mais informações específicadas da exceção. A classe 'EDBEngineError' é descendente direto de 'EDatabaseError', mas possui algumas propriedades adicionais úteis para um tratamento mais refinado de exceções. Dentre elas, destaca-se o array ERRORS, o qual possui uma série de propriedades, dentre as quais:Algumas propriedades do ARRAY ERRORS:============================- ErrorCode: retorna o código do erro, quando for um erro de BDE (por isto que eu queria saber se vc. usava o não BDE);- Category: retorna a categoria do erro referenciada em ErrorCode;- SubCode: retorna o sub-código do erro. Especifica mais informações sobre o erro ocorrido;- NativeError: utilizado somente quando se está conectado a um servidor de banco de dados. Se o retorno do NativeError for igual a zero, então não é erro do servidor, caso contrário, o código do erro é retornado;- Message: Estando conectado a um servidor SQL, você retornará a mensagem do servidor, caso contrário, retornará a mensage do BDE.Exemplo:=============================================================procedure TForm1.Button1Click(Sender: TObject);begin try table1.post; ShowMessage('Registro gravado com sucesso.'); table1.Refresh; except on E:EDBEngineError do begin if E.Errors[0].ErrorCode=9729 then Raise Exception.Create ('Violação da chave primária') else begin ShowMessage('Erro geral de gravação.' + E.Message); Table1.Cancel; end; end; end;end;=============================================================A variável 'E' no código acima recebe todas as informações da exceção gerada, para posteriormente ser utilizada em nosso formulário de saída de mensagens.Por fim, vale a pena observar que existem alguns eventos dos componentes 'TDataSet' que são bastante interessantes e apropriados para manipulaçao de exceções, tais como, 'OnPostError', 'OnEditError' e 'OnDeleteError'. Um exemplo já foi dado pelo nosso colega ALESSANDRO acima.Espero ter mostrado uma "luz" para você.Abraços. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Turbo Postado Julho 2, 2004 Autor Denunciar Share Postado Julho 2, 2004 cara vlw, mas o que tou querendo é o seguinte:* eu to acessando as tabelas através de sql * estou usando o try* tenho uma variavel do tipo E que recebe todo e qualquer tipo de exception* eu quero criar uma função que passando essa variavel E, consiga manipular todos os erros de um banco de dados, e colocar essa função em uma dll. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Capablanca Postado Julho 2, 2004 Denunciar Share Postado Julho 2, 2004 cara vlw, mas o que tou querendo é o seguinte:* eu to acessando as tabelas através de sql * estou usando o try* tenho uma variavel do tipo E que recebe todo e qualquer tipo de exception* eu quero criar uma função que passando essa variavel E, consiga manipular todos os erros de um banco de dados, e colocar essa função em uma dll.Não há diferença em você acessar através de SQL. O exemplo que eu dei também utiliza o TRY, bem como a variável 'E'. Veja, esta variável 'E' recebe todas as informações da exceção gerada. A exceção carrega consigo uma série de informações pertinentes a ela, e estas informações estão sendo adicionadas à variável.Eu fiz um EXEMPLO com uma função chamada 'TrataErros'. Dê uma olhada e veja se ajuda em alguma coisa.Download: http://www.cordeirorodrigues.com.br/capabl.../forum/r_08.zip Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Turbo
fala galera, o problema é : quero fazer uma função que trate os erros mais comuns de banco de dados.
porque estou tratando todos de uma unica forma, como exception, e dando uma mensagem generica....
como faço para criar uma função que trate os erros de BD, tipo Access Violation, Violation Key....
espero ajuda c possivel....
vlw....
Link para o comentário
Compartilhar em outros sites
8 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.