Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Tratamento De Erro No Ado Acessando O Postgres


Samuelsjn

Pergunta

10 respostass a esta questão

Posts Recomendados

  • 0
Amigos,

Estou com dúvidas em relação ao tratamento de exceção gerada pelo SGBD Postgres. alguém possui um exemplo que possa compartilhar?

Estou utilizando a conexão através do componente, ADOConnection e ADOQuery, e ODBC....

alguém poderia me ajudar?

Obrigado

Abraço

Qual a exceção???

todas???

ou so os erros mesmo quando o query ta retornando o except?

Link para o comentário
Compartilhar em outros sites

  • 0

Ola Mayron Cachina,

Como vai?

Quero saber na verdade, em qual evento que faço isso no componente ADOConnection.

Os erros gerados pelo Postgres eu descubro quando for ocorrendo.

Eu tenho um tratamento de exeção do InterBase. Mas os eventos são diferentes e como nunca usei o ADOConnection estou um pouco perdido.

Abraço e obrigado

Link para o comentário
Compartilhar em outros sites

  • 0

Olha eu faço desse jeito...

digamos que eu tenha um dbgrid e dele eu tenha q pegar o id do registro no evento oncell click...

try
   data_cliente := FormatDateTime('yyyy-mm-dd',dbgManutencao.DataSource.DataSet.FieldValues['data']);
   id_da_manutencao := dbgManutencao.DataSource.DataSet.FieldValues['idtb_manutencao'];
except
On E: Exception Do
    begin
      ShowMessage(E.Message);
    end;
end;

dai você pode pegar uma procedure pra tratar em cima desse E.Message....

é isso que você queria saber???

ou eu me enganei?

Link para o comentário
Compartilhar em outros sites

  • 0
Entaum voce trata o erro na hora que você chama o banco, e não no DataModule.
É o mais usual. Há um componente (não lembro qual) que até tem um evento para quando ocorrem erros no banco. Mas o usual é isto: utilizar um try..except..end

Veja também este post.

Há diferenças em tratar o try..except e utilizar um ShowMessage para mostrar a mensagem. Como a exceção não ocorrerá, o programa continua a execução após o "end" do try..except. Isto não ocorre no exemplo que postei: o raise fará com que a execução pare naquele ponto. (normalmente é o desejável). Vai do caso.

Link para o comentário
Compartilhar em outros sites

  • 0

Ola pessoal,

Tentei utilizar o try exceptio end, mais não obtive sucesso. Abaixo a parte do código q estou utilizando.

alguém poderia me ajudar?

try
      dtmdlCIM.QueryPrincipal.ExecSQL;
    except
      on E: EDatabaseErro do
      begin
        if Pos('ERROR: insert or update on table "item" violates foreign key constraint "item_idcategoria_fkey";Error while executing the query.', UpperCase(E.Message)) > 0 then
        begin
          ShowMessage('Dados importantes não foram preenchidos!');
          raise;
        end;
     end;
   end;

Obrigado

Editado por Micheus
Incluída tag's CODE para melhorar a visualização. Utilize a identação também ;)
Link para o comentário
Compartilhar em outros sites

  • 0

Samuelsjn, o seu problema reside no fato de que você está querendo comparar a mensagem "normal" (com maiúsculas e minúsculas) com a mensagem original da exceção em maiúscula (você está utilizando UpperCase):

if Pos('ERROR: insert or update on table "item" violates foreign key constraint "item_idcategoria_fkey";Error while executing the query.', UpperCase(E.Message)) > 0 then

Mas a título de garantir o resultado, o correto seria realmente testar tudo (os dois lados) em maiúscula ou minúscula (tanto faz), então a sugestão seria deixar como você verá abaixo.

Sugiro ainda que deixe o tratamento um pouco mais gernérico - não precisa colocar todos os detalhes da mensagem, apenas aquilo que a identifica (no seu caso a violação da chave estrangeira). Também é interessante observar que, se você vai permitir o RAISE (que abortará a continuidade da execução de sua procedure), então fica mais lógico você modificar a mensagem original da exceção e não utilizar a função ShowMessage:

...
  try
    dtmdlCIM.QueryPrincipal.ExecSQL;
  except
    on E: EDatabaseErro do
    begin
      if Pos('violates foreign key constraint', LowerCase(E.Message)) > 0 then
      begin
        E.Message := 'Dados importantes não foram preenchidos!'#10#10'Erro: ' +E.Message;
        raise;
      end;
    end;
  end;

Voce pode apenas atribuir a sua mensagem para a propriedade Message, mas por questões de "segurança", eu costumo agregar ao final da mesma a mensgem original (fica a seu critério).

Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,7k
×
×
  • Criar Novo...