Sistema java mostra mensagem de sucesso ao editar mas não edita os dados [RESOLVIDO]

10 respostas
programaçãojava
aeciocleysson

boa noite

estou desenvolvendo um sistema java em 3 camadas, mas estou com problema para editar os dados.

tenho um Jtable que me mostra os dados quando digito o nome em um Jtextfield. já tentei fazer a edição cm o critério where nome, e where id.

já testei varias vezes e refiz o código varias vezes mas não encontrei a solução se alguem puder me ajudar.

Esse é o método da minha classe DAL

public void editarCliente(Cliente_Juridico cliente) {

    StringBuilder sql = new StringBuilder();

    try {

        sql.append("UPDATE FROM tbl_cliente_juridico ");
        sql.append("SET nome_cliente_J = ?, cnpj = ?, telefone = ?, celular = ?, email = ?, endereco = ?, num_end = ?, bairro = ?, cidade = ?, estado = ? ");
        sql.append("WHERE nome_cliente_J = ? ");

        Connection connection = ModuloConexao.conector();

        PreparedStatement comando = connection.prepareStatement(sql.toString());

        comando.setString(1, cliente.getNome_cliente_J());
        comando.setString(2, cliente.getCnpj());
        comando.setString(3, cliente.getTelefone());
        comando.setString(4, cliente.getCelular());
        comando.setString(5, cliente.getEmail());
        comando.setString(6, cliente.getEndereco());
        comando.setString(7, cliente.getNum_end());
        comando.setString(8, cliente.getBairro());
        comando.setString(9, cliente.getCidade());
        comando.setString(10, cliente.getEstado());
        comando.setString(11, cliente.getCategoria());

        comando.executeUpdate();

    } catch (SQLException erro) {

        System.out.println(erro);
    }

}

Esse é o método da classe BLL que faz a ligação com a classe DAL

public void editarClienteDAL(Cliente_Juridico cliente){

Cliente_Juridico_DAL dal = new Cliente_Juridico_DAL();
    
    dal.editarCliente(cliente);
}

esse é o método dentro do Jframe

public void editarCliente_J(Cliente_Juridico cliente){
    
    ClasseBLL_J bll = new ClasseBLL_J();
    
    cliente.setNome_cliente_J(txt_nome_edit.getText());
    cliente.setCnpj(txt_cnpj_edit.getText());
    cliente.setTelefone(txt_fixo_edit.getText());
    cliente.setCelular(txt_cel_edit.getText());
    cliente.setEmail(txt_email_edit.getText());
    cliente.setEndereco(txt_end_edit.getText());
    cliente.setNum_end(txt_num_edit.getText());
    cliente.setBairro(txt_bairro_edit.getText());
    cliente.setCidade(txt_cidade_edit.getText());
    cliente.setEstado(cb_uf_edit.getSelectedItem().toString());
    
    
    bll.editarClienteDAL(cliente);
    
    JOptionPane.showMessageDialog(null, "Editado com sucesso");
}

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

Cliente_Juridico cliente = new Cliente_Juridico();
    editarCliente_J(cliente);
  
}

10 Respostas

Chaybelucas

Boa noite

Cara, é DAO e não DAL. E quando for usar um WHERE, não usa um nome. Usa um id, preferencialmente uma chave primária, pois ela não vai se repetir. E digo mais, quando for usar WHERE com um texto, não usa o comparador “=”, usa o comparador “LIKE”

No mais, eu não uso PreparedStatement, eu uso Statement mesmo. É questão de trocar PreparedStatement por Statement. Talvez dê certo. O que pode estar acontecendo é o sql tá executando, mas não encontra o teu registro pelo parâmetro que tá passando.

Pra verificar, faz debug ou exibe o parâmetro que tá buscando, no console.

System.out.println("Parametro: " + cliente.getNome_cliente_J()); // ou cliente.getID_cliente_J caso exista id

staroski

Como nosso amigo @Chaybelucas já mencionou, o nome é DAO de Data Access Object.

Ao contrário do que ele disse, ao fazer INSERT ou UPDATE sempre é melhor utilizar o PreparedStatement, para garantir que o driver JDBC trate corretamente a conversão dos tipos de dado Java para os tipos de dado do banco…

Sobre você receber mensagem de "Editado com sucesso" mesmo quando não editou, é porque o seu método editarCliente possui um try-catch que está suprimindo a exceção, aí obviamente quem for chamar esse método, não vai perceber que houve um problema.

Tira o try-catch e declara o throws na assinatura do método, assim, quem for chamar o método deverá tratar a exceção.

aeciocleysson

Muito obrigado pelas dicas, já até corrigi a inscrita do meu DAO, vi algumas aulas o pessoal escrevendo DAL e peguei o erro. vou fazer o que me disse e digo se deu certo.

A

Remova o FROM.

aeciocleysson

Já tirei o FROM e não atualiza, vou revisar o código novamente

A

Acho que devia ser cliente.getCNPJ (). Pois se vc olhar sua tabela, vai ver que a categoria não tem nada escrito.

Adendo: ajustar a cláusula WHERE

aeciocleysson

é o seguinte, tenho uma tela de cadastro de clientes que tem um combo box categoria que tem as opções de cliente pessoa FISICA e JURIDICA, e quando for selecionado FISICA o campo
CNPJ ficara Enabled(false) e da mesma forma se for selecionado JURIDICA o campo CPF ficara Enabled(false).

Gabrielfp

Eu recomendo uma coisa bem simples, ao invés de usar um método void use um boolean, assim só vai aparecer mensagem de “Atualizado com sucesso!” se o método realmente executar o sql.
Ex:

public boolean editarCliente(Cliente_Juridico cliente) {

    StringBuilder sql = new StringBuilder();

    try {

        sql.append("UPDATE FROM tbl_cliente_juridico ");
        sql.append("SET nome_cliente_J = ?, cnpj = ?, telefone = ?, celular = ?, email = ?, endereco = ?, num_end = ?, bairro = ?, cidade = ?, estado = ? ");
        sql.append("WHERE nome_cliente_J = ? ");

        Connection connection = ModuloConexao.conector();

        PreparedStatement comando = connection.prepareStatement(sql.toString());

        comando.setString(1, cliente.getNome_cliente_J());
        comando.setString(2, cliente.getCnpj());
        comando.setString(3, cliente.getTelefone());
        comando.setString(4, cliente.getCelular());
        comando.setString(5, cliente.getEmail());
        comando.setString(6, cliente.getEndereco());
        comando.setString(7, cliente.getNum_end());
        comando.setString(8, cliente.getBairro());
        comando.setString(9, cliente.getCidade());
        comando.setString(10, cliente.getEstado());
        comando.setString(11, cliente.getCategoria());

       int editado = comando.executeUpdate();
       if(editado > 0){
          return true;
       }

    } catch (SQLException erro) {
        System.out.println(erro);
    }
    return false;
}

Eu também recomendaria você instanciar diretamente esse método sem o uso de outro método para buscar os dados, usando um construtor da classe Cliente_Juridico para buscar esses dados, fazendo os devidos tratamentos de mensagens dentro do método actionPerformed do botão que vai chamar o método.

A

Você esta comparando os dados da coluna nome_cliente_J com a categoria do cliente, não faz sentido nenhum.

Reveja a sentença sql.

Sugestão comparar o CNPJ do cliente com o existente no banco de dados, pois o CNPJ deve ser cadastrado como chave única.
Realizar o update de um cliente com base no nome é prejuízo.

Resumo, reveja o SQL, pois ele não é coerente.

aeciocleysson

refiz todos os métodos e deu certo. obrigado pela ajuda de todos

Criado 16 de agosto de 2017
Ultima resposta 20 de ago. de 2017
Respostas 10
Participantes 5