[RESOLVIDO]Erro ao pegar Dado do banco. botão alterar

8 respostas
D

to fazendo meu primeiro programa com interface, mas tem um problema que eu não consigo resolver… é no botão alterar, na hora de setar o ID(eu acho que o problema é aqui)

codigo classe DAO:

public void adiciona(Cliente c1) throws SQLException {
        String sql = "insert into cliente (nome , endereco, telefone, cpf, identidade, referencia)" +
                "values (?, ?, ?, ?, ?, ?)";
        PreparedStatement stmt = conexao.prepareStatement(sql);

        stmt.setString(1, c1.getNome());
        stmt.setString(2, c1.getEndereco());
        stmt.setString(3, c1.getTelefone());
        stmt.setString(4, c1.getCpf());
        stmt.setString(5, c1.getIdentidade());
        stmt.setString(6, c1.getReferencia());

        stmt.execute();
        stmt.close();

    }
public void altera(Cliente c1) throws SQLException {
        String sql = "Update cliente set nome=?, endereco=?, telefone=?, cpf=?, identidade=?, referencia=? where id=?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setLong(1, c1.getId());
        stmt.setString(2, c1.getNome());
        stmt.setString(3, c1.getEndereco());
        stmt.setString(4, c1.getTelefone());
        stmt.setString(5, c1.getCpf());
        stmt.setString(6, c1.getIdentidade());
        stmt.setString(7, c1.getReferencia());
        

        stmt.execute();
        stmt.close();


    }

    public void remove(Cliente c1) throws SQLException {

        String sql = "delete from cliente where id=?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setLong(1, c1.getId());
        stmt.execute();
        stmt.close();


    }

Parte Grafica:

private void jBSalvarActionPerformed(java.awt.event.ActionEvent evt) {                                         

        if (VerificaDados()) {
            cadastro();
            desabilitaDados();
        }

    }
private void jBExcluirActionPerformed(java.awt.event.ActionEvent evt) {                                          
        int resp = JOptionPane.showConfirmDialog(this, "Deseja realmente excluir este cliente?",
                 "Confirmação", JOptionPane.YES_NO_OPTION);
        if(resp == JOptionPane.YES_NO_OPTION){
            ClienteDao dao;
            try {
                dao = new ClienteDao();
                dao.remove(clientes.get(jTabela.getSelectedRow()));
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Erro no Botão jBExcluir" + ex);
            }


        }
    }                                         

    private void jBAlterarActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:

       int resp = JOptionPane.showConfirmDialog(this, "Deseja realmente alterar este cliente?",
                 "Confirmação", JOptionPane.YES_NO_OPTION);
        if(resp == JOptionPane.YES_NO_OPTION){
            alterar();
            ClienteDao dao;
            try {
                dao = new ClienteDao();
                dao.altera(clientes.get(jTabela.getSelectedRow()));
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, "Erro no Botão jBAlterar" + ex);
            }

        }
    }
public void alterar(){
        try {
            Cliente c1 = new Cliente();
            

            c1.setNome(jTNome.getText());
            c1.setEndereco(jTEndereco.getText());
            c1.setTelefone(jTTelefone.getText());
            c1.setCpf(jTCPF.getText());
            c1.setIdentidade(jTIdentidade.getText());
            c1.setReferencia(jTReferencia.getText());
            ClienteDao dao = new ClienteDao();
            dao.altera(c1);
        } catch (SQLException ex) {
            Logger.getLogger(jTCliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void cadastro() {

        try {
            Cliente c1 = new Cliente();
            c1.setNome(jTNome.getText());
            c1.setEndereco(jTEndereco.getText());
            c1.setTelefone(jTTelefone.getText());
            c1.setCpf(jTCPF.getText());
            c1.setIdentidade(jTIdentidade.getText());
            c1.setReferencia(jTReferencia.getText());
            ClienteDao dao = new ClienteDao();
            dao.adiciona(c1);
        } catch (SQLException ex) {
            Logger.getLogger(jTCliente.class.getName()).log(Level.SEVERE, null, ex);

        }
    }

o remove e o salvar estão perfeitos, o problema é só no alterar, ele não vai de jeito nenhum.

8 Respostas

M

No seu método alterar() você cria um novo Cliente e sequer define um ID para ele. Como ele vai ser alterado no banco então?

Outra coisa: na linha 35 e 54 você chama o dao.altera(Cliente). Para que chamar isso duas vezes? Deveria ser apenas uma.

Isso significa que o actionPerformed do seu botão terá apenas a confirmação e a chamada para o método alterar (é nele que ficará a lógica de alteração):

private void jBAlterarActionPerformed(java.awt.event.ActionEvent evt) {                                          
       int resp = JOptionPane.showConfirmDialog(this, "Deseja realmente alterar este cliente?",
                 "Confirmação", JOptionPane.YES_NO_OPTION);
        if(resp == JOptionPane.YES_NO_OPTION){
            alterar();
        }
    }

E no método alterar você deve pegar o Cliente selecionado e alterar seus atributos (não instanciar um novo como você está fazendo):

public void alterar(){
        try {
            Cliente c1 = clientes.get(jTabela.getSelectedRow()); // fazendo isso resgatamos os atributos antigos (incluindo o ID)
            c1.setNome(jTNome.getText());
            c1.setEndereco(jTEndereco.getText());
            c1.setTelefone(jTTelefone.getText());
            c1.setCpf(jTCPF.getText());
            c1.setIdentidade(jTIdentidade.getText());
            c1.setReferencia(jTReferencia.getText());
            ClienteDao dao = new ClienteDao();
            dao.altera(c1);
        } catch (SQLException ex) {
Logger.getLogger(jTCliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
D

Obrigado pela resposta, mas ainda não resolveu.
no final o cliente não altera de jeito nenhum.
eu acho que eu sei a maneira certa mas preciso de ajuda nesse codigo:

pelo que eu vi, tem que transformar o id em string.

não é preciso eu colocar um

?

só que esse “pegadobanco” eu não sei fazer .

M

Como você está resgatando a lista de Clientes do BD?

D
protected void listarCliente() throws SQLException {
        ClienteDao dao = new ClienteDao();
        clientes = dao.getLista("%" + jTPesquisa.getText() + "%");
        mostraPesquisa(clientes);
}
 private void mostraPesquisa(List<Cliente> clientes) {
        while(tmCliente.getRowCount()>0){
            tmCliente.removeRow(0);
        }
        if (clientes.size() == 0) {
            JOptionPane.showMessageDialog(null, "Nenhum cliente cadastrado");
        } else {
            String[] linha = new String[]{null, null, null, null, null, null, null};
            for (int i = 0; i < clientes.size(); i++) {
                tmCliente.addRow(linha);
                tmCliente.setValueAt(clientes.get(i).getId(), i, 0);
                tmCliente.setValueAt(clientes.get(i).getNome(), i, 1);
                tmCliente.setValueAt(clientes.get(i).getEndereco(), i, 2);
                tmCliente.setValueAt(clientes.get(i).getTelefone(), i, 3);
                tmCliente.setValueAt(clientes.get(i).getCpf(), i, 4);
                tmCliente.setValueAt(clientes.get(i).getIdentidade(), i, 5);
                tmCliente.setValueAt(clientes.get(i).getReferencia(), i, 6);
            }
        }
    }

no DAO:

public List<Cliente> getLista(String Nome) throws SQLException {
        String sql = "select * from cliente where nome like ?";
        PreparedStatement stmt = this.conexao.prepareStatement(sql);
        stmt.setString(1, Nome);
        ResultSet rs = stmt.executeQuery();

        List<Cliente> minhaLista = new ArrayList<Cliente>();

        while (rs.next()) {
            Cliente c1 = new Cliente();

            c1.setId(Long.valueOf(rs.getString("Id")));
            c1.setNome(rs.getString("nome"));
            c1.setEndereco(rs.getString("endereco"));
            c1.setTelefone(rs.getString("telefone"));
            c1.setCpf(rs.getString("Cpf"));
            c1.setIdentidade(rs.getString("Identidade"));
            c1.setReferencia(rs.getString("Referencia"));
            minhaLista.add(c1);
        }

        rs.close();
        stmt.close();
        return minhaLista;

    }

assim, a variavel ID no banco é INT e autoincrement .
no programa ela tá como LONG.

obrigado por me ajudar,

M

Por quê?

PS: o ResultSet tem os métodos getInt e getLong, não precisando fazer esse cast.

D

marco, e qual é a bronca? não da pra entender…

furutani

Acho que ele quiz dizer que você pode fazer assim

ao invés de dar essa volta

D

ERRO RESOLVIDO.

era a ordem do id na classe DAO.

é pro ID ser o 7.

obrigado marco, até a proxima.

Criado 30 de janeiro de 2010
Ultima resposta 30 de jan. de 2010
Respostas 8
Participantes 3