Como testar se ID já existe no BD [RESOLVIDO]

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.

[code]public class JDBCSalvar {

public void salvar(Box box) {
    Connection conn = PostgreSQL.getConnection();


    //SALVAR BOX


    try {


        String sql = ("Insert Into box(id_box,vago) values (?,?)");

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setInt(1, box.getId());
        stmt.setBoolean(2, box.isVago());
                     
        stmt.executeUpdate();
       
        JOptionPane.showMessageDialog(null, "CLIENTE SALVO COM SUCESSO");
        


    }catch (Exception e) {
        JOptionPane.showMessageDialog(null, "erro ao salvar Box" + e.getMessage());
    }[/code]

eeeer…

Select?

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.

Como a Cíntia disse…

Faça um Select e verifique se esse ID já não se encontra cadastrado no Banco de Dados.

public void seuMetodoSalvar(Bean bean) throws SQLException {

    String query = "Select * From Tabela Where ID = ?";
    PreparedStatement statement = connection.prepareStatement(query);
    statement.setLong(1, bean.getID());

    ResultSet result = statement.executeQuery();
    // se não retornar nenhum resultado, significa que o ID não existe no banco!
    if (!result.next()) {

        //...
    }
}

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.

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?

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.

Fato ^^.

[quote]Mas usar exception não é menos seguro que uma select. Só tem que ver qual ele retorna quando o id já existe.[/quote] 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.

[quote]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.[/quote] 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.

Vc fala como se fosse algo complicado tratar um erro.
É só colocar um catch(ExistingIdException e) ou alguma coisa assim.

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.

[code]public class JDBCSalvar {

public void testeId(Box box) {
    Connection testaId = PostgreSQL.getConnection();
    try {

        String sql = "select * from cliente where id_cliente = ?";
        PreparedStatement stmt = testaId.prepareStatement(sql);
        stmt.setInt(1, box.getCliente().getId());

        ResultSet rs = stmt.executeQuery();
        if (!rs.next()) {
            salvar(box);
        } else {
            JOptionPane.showMessageDialog(null, "Box ainda não está disponivel");
        }

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "erro ao salvar CLIENTE RESERVA" + e.getMessage());

    } finally {

        try {

            testaId.close();
        } catch (SQLException ex) {
            Logger.getLogger(JDBCCriarTabela.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
}

public void salvar(Box box) {

    Connection conn = PostgreSQL.getConnection();

    //SALVAR BOX

    try {


        String sql = ("Insert Into box(id_box,vago) values (?,?)");

        PreparedStatement stmt = conn.prepareStatement(sql);

        stmt.setInt(1, box.getId());
        stmt.setBoolean(2, box.isVago());

        stmt.executeUpdate();

        JOptionPane.showMessageDialog(null, "CLIENTE SALVO COM SUCESSO");



    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "erro ao salvar Box" + e.getMessage());
    }[/code]