Como Tratar erro enviado pelo Firebird no delphi
Ola estou com a duvida com tratar erro que venha do sgdb, Ex: eu criei alguns campos no Firebird 1.5 com a constraints- unique, ou seja eu nao posso digitar estes campos mais de uma vez iguais, para ser utilizado em CPF e outros, mas quando eu insiro um valor igual ele me retorna um erro do banco informando q é um unique key, ai pergunto como eu devo tratar estes erro eu que sao enviados pelo Firebird ????
Caso alguem possa ajudar é algo muito util para muitos... VLw
Caso alguem possa ajudar é algo muito util para muitos... VLw
Digaopachesen
Curtidas 0
Respostas
Fabiano Góes
17/04/2008
O Delphi te um componente chamado: [b:aa80bae9c7]ApplicationEvents[/b:aa80bae9c7], que está na paleta Additional.
coloque este componente no form principal do projeto, e no evento:
OnException faça o tratamento de erros.
alguma coisa desse tipo:
coloque este componente no form principal do projeto, e no evento:
OnException faça o tratamento de erros.
alguma coisa desse tipo:
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if Pos(UpperCase(´key violation´), UpperCase(e.Message)) > 0 then ShowMessage(´Violação de chave primaria ou chave unica´); end;
GOSTEI 0
Digaopachesen
17/04/2008
Obrigado por responder, hj eu consegui esta informacao com um colega mas eu nao peguei o codigo para comparar com a tua resposta, bom eu fiz como vc informa e nao deu nenhum erro quando riz o teste e nenhuma mensagem nao entendi se era esta a resposta que ele deveria dar oou deveria informar o erro como descrito no show message vlw
GOSTEI 0
Marco Salles
17/04/2008
eu acho que depende entre outros dos componentes de acesso ao SGDB
que voce utiliza ... Por exemplo o clientDataSet não propaga o erro . então se vc estiver usando o cds a dica do fabiano.goes talvez não funcione
que voce utiliza ... Por exemplo o clientDataSet não propaga o erro . então se vc estiver usando o cds a dica do fabiano.goes talvez não funcione
GOSTEI 0
Fabiano Góes
17/04/2008
[quote:61ee6c7ccb=´Marco Salles´]eu acho que depende entre outros dos componentes de acesso ao SGDB
que voce utiliza ... Por exemplo o clientDataSet não propaga o erro . então se vc estiver usando o cds a dica do fabiano.goes talvez não funcione[/quote:61ee6c7ccb]
Marcos,
aproveitando a deixa,
qual a maneira correta de se tratar erro quando se usa clientdataset?
que voce utiliza ... Por exemplo o clientDataSet não propaga o erro . então se vc estiver usando o cds a dica do fabiano.goes talvez não funcione[/quote:61ee6c7ccb]
Marcos,
aproveitando a deixa,
qual a maneira correta de se tratar erro quando se usa clientdataset?
GOSTEI 0
Marco Salles
17/04/2008
acredito que no evento econcileerror do clientdataset
o delphi tem ate o formulario ReconcileErrorForm ja pronto para ser adicionado ao projeto
no evento oneconcilerror do clienteDataSet voce cria ou chama este formulário
acho que é uma boa opção
o delphi tem ate o formulario ReconcileErrorForm ja pronto para ser adicionado ao projeto
File -->> new -->> other -->> Dialogs
no evento oneconcilerror do clienteDataSet voce cria ou chama este formulário
Action := HandleReconcileError(DataSet, UpdateKind, e);
acho que é uma boa opção
GOSTEI 0
Digaopachesen
17/04/2008
bom estou utilizando um SimpleDataSet componente DbExpress, agora no meu projeto quando ocorre algun erro ele informa o erro como sempre mas se eu executar diretamente pelo executavel ele nao informa qual é o erro acredito q seja pq o erro q ocorreu eu nao estou verificando, simplismente ele continua a aplicacao como se nada tivesse acontecido... agora esta assim eu incluo 10 cadastro novos com o nome iguais em todas, em meu projeto o campo NOME esta utilizando uma chave unica ou seja se ja existir um nome igual ele nao deixa gravar , entao utilizando a primeira indicacao do colega eu posso adicionar 10 item e ele mostra como se tivesse gravado mas quando eu saio do sistema ele nao gravou nenhum dos registro q digitei com o nome igual...como fazer para tratar esta situacao...desde ja Agradeco
GOSTEI 0
Digaopachesen
17/04/2008
utilizando a indicaçõa
Código:
procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
if Pos(UpperCase(´key violation´), UpperCase(e.Message)) > 0 then
ShowMessage(´Violação de chave primaria ou chave unica´);
end;
eu adicionei um showmessage com qualquer coisa para ver se estava funcionando e realmente estava mas assim o registro fica como se estivesse salvo eu tentei da refresh no componente, tentei cancelar, mas nao deu certo, e ele fica como se estive salvo, ai se eu fechar e abrir novamente este registro q deu erro nao vai estar mais la, como q posso fazer para q ele ou fique como se eu estive editando o registro ainda????
vlw pela ajuda
Código:
procedure TForm1.ApplicationEvents1Exception(Sender: TObject;
E: Exception);
begin
if Pos(UpperCase(´key violation´), UpperCase(e.Message)) > 0 then
ShowMessage(´Violação de chave primaria ou chave unica´);
end;
eu adicionei um showmessage com qualquer coisa para ver se estava funcionando e realmente estava mas assim o registro fica como se estivesse salvo eu tentei da refresh no componente, tentei cancelar, mas nao deu certo, e ele fica como se estive salvo, ai se eu fechar e abrir novamente este registro q deu erro nao vai estar mais la, como q posso fazer para q ele ou fique como se eu estive editando o registro ainda????
vlw pela ajuda
GOSTEI 0
Marco Salles
17/04/2008
se voce nao quiser usar o form de exceção ([b:e413cb6bba]ReconcileErrorForm[/b:e413cb6bba]) como sugerido voce deve fazer o seguinte
acho que esta exceção seguido do abort , evita a inclusão.... estou sem o delphi para testar ... mas tente isso
boa sorte
procedure TForm1.ApplicationEvents1Exception(Sender: TObject; E: Exception); begin if Pos(UpperCase(´key violation´), UpperCase(e.Message)) > 0 then begin raise exception.Create(´Violação de Chave Primaria´); abort; end;
acho que esta exceção seguido do abort , evita a inclusão.... estou sem o delphi para testar ... mas tente isso
boa sorte
GOSTEI 0