Não estou conseguindo testar se o id_box já existe.
Preciso fazer um teste que informe se o ID existe? Se existir retornar a tela de cadastro.
publicclassJDBCSalvar{publicvoidsalvar(Boxbox){Connectionconn=PostgreSQL.getConnection();//SALVARBOXtry{Stringsql=("Insert Into box(id_box,vago) values (?,?)");PreparedStatementstmt=conn.prepareStatement(sql);stmt.setInt(1,box.getId());stmt.setBoolean(2,box.isVago());stmt.executeUpdate();JOptionPane.showMessageDialog(null,"CLIENTE SALVO COM SUCESSO");}catch(Exceptione){JOptionPane.showMessageDialog(null,"erro ao salvar Box"+e.getMessage());}
Você pode também capturar o erro através de um SQLException, que é mais específico. Uma coisa interessante de olhar é o getErrorCode() dessa classe. Aí lá no catch você aplica o tratamento que quiser.
N
Nicolas_Fernandes
Como a Cíntia disse…
Faça um Select e verifique se esse ID já não se encontra cadastrado no Banco de Dados.
publicvoidseuMetodoSalvar(Beanbean)throwsSQLException{Stringquery="Select * From Tabela Where ID = ?";PreparedStatementstatement=connection.prepareStatement(query);statement.setLong(1,bean.getID());ResultSetresult=statement.executeQuery();//senãoretornarnenhumresultado,significaqueoIDnãoexistenobanco!if(!result.next()){//...}}
T
thierrypin
O algoritmo fica mais rápido que não tiveres que acessar o banco duas vezes. Tenta inserir e verifica se vem exception, e qual.
N
Nicolas_Fernandes
Se ele fizer o acesso ao Banco de Dados com a mesma conexão ao invés de usar uma conexão para cada operação, a diferença de tempo fica praticamente inexistente. Além do mais, é mais seguro você controlar na mão do que depender de uma exceção para resolver seu problema, não acha?
T
thierrypin
Realmente o tempo de uma select é pequeno.
Mas usar exception não é menos seguro que uma select. Só tem que ver qual ele retorna quando o id já existe.
Além do mais, a manipulação de erro deve existir de uma forma ou de outra. A questão é só escolher as ações para cada tipo de exception.
N
Nicolas_Fernandes
Fato ^^.
Mas usar exception não é menos seguro que uma select. Só tem que ver qual ele retorna quando o id já existe.
Não seria melhor, ao invés de ficar fuçando e procurando o número da exception que gera para duplicações de chaves primárias, você fazer uma consulta que faça isso pra você, sendo muito mais legível?
Eu, por exemplo, prefiro fazer todo esse tipo de validação (quando não uso um framework) na mão, ao invés de esperar uma exception específica. Acho que fica mais inteligível pra quem também for fazer uso do código.
Além do mais, a manipulação de erro deve existir de uma forma ou de outra. A questão é só escolher as ações para cada tipo de exception.
Sim, mas eu acho que é legal você fazer a manipulação de erro quando este é algo que não se espera ou não tem como evitar.
T
thierrypin
Vc fala como se fosse algo complicado tratar um erro.
É só colocar um catch(ExistingIdException e) ou alguma coisa assim.
M
Maureli
Obrigado pela ajuda.
Criei um método para testar o ID.
Não consegui fazer a implementação através da exeção, quando o programa entra no Catch ele joga na tela todos os erros, isso atrapalha o funcionamento do meu programa.
publicclassJDBCSalvar{publicvoidtesteId(Boxbox){ConnectiontestaId=PostgreSQL.getConnection();try{Stringsql="select * from cliente where id_cliente = ?";PreparedStatementstmt=testaId.prepareStatement(sql);stmt.setInt(1,box.getCliente().getId());ResultSetrs=stmt.executeQuery();if(!rs.next()){salvar(box);}else{JOptionPane.showMessageDialog(null,"Box ainda não está disponivel");}}catch(Exceptione){JOptionPane.showMessageDialog(null,"erro ao salvar CLIENTE RESERVA"+e.getMessage());}finally{try{testaId.close();}catch(SQLExceptionex){Logger.getLogger(JDBCCriarTabela.class.getName()).log(Level.SEVERE,null,ex);}}}publicvoidsalvar(Boxbox){Connectionconn=PostgreSQL.getConnection();//SALVARBOXtry{Stringsql=("Insert Into box(id_box,vago) values (?,?)");PreparedStatementstmt=conn.prepareStatement(sql);stmt.setInt(1,box.getId());stmt.setBoolean(2,box.isVago());stmt.executeUpdate();JOptionPane.showMessageDialog(null,"CLIENTE SALVO COM SUCESSO");}catch(Exceptione){JOptionPane.showMessageDialog(null,"erro ao salvar Box"+e.getMessage());}