Erro ao Fazer UPDATE [RESOLVIDO]

11 respostas
Maureli

Estou recebendo um erro:

ERRO DE SINTAXE EM OU Proximo a ","

public class JDBCUpdate {
    public void alterar(Cliente cli, Endereco end){
     Connection update = PostgreSQL.getConnection();

     try{
         String sql = ("Update cliente, endereco set id_cliente=?, nome=?, cpf=?, id_endereco=?, rua=?, numero=?, complemento=?");

         PreparedStatement stmt = update.prepareStatement(sql);
         Cliente cliente = new Cliente();
         Endereco endereco = new Endereco();

         stmt.setInt(1, cliente.getId());
         stmt.setString(2, cliente.getNome());
         stmt.setLong(3, cliente.getCpf());

         stmt.setInt(4, endereco.getId());
         stmt.setString(5, endereco.getRua());
         stmt.setInt(6, endereco.getNumero());
         stmt.setString(7, endereco.getComplemento());



         stmt.executeUpdate();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "erro ao fazer o Update " + e.getMessage());

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

        }
    }
}

11 Respostas

emanuelCruz

Está tentando alterar duas tabelas ao mesmo tempo e isso nao pode.
Altere um de cada vez …

Para alterar cliente:

public class JDBCUpdate {
    public void alterar(Cliente cli){
     Connection update = PostgreSQL.getConnection();

     try{
         String sql = ("Update cliente set id_cliente=?, nome=?, cpf=?, id_endereco=?");

         PreparedStatement stmt = update.prepareStatement(sql);
         Cliente cliente = new Cliente();
         Endereco endereco = new Endereco();

         stmt.setInt(1, cliente.getId());
         stmt.setString(2, cliente.getNome());
         stmt.setLong(3, cliente.getCpf());

         stmt.setInt(4, cliente.getIdEndereco());

         stmt.executeUpdate();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "erro ao fazer o Update " + e.getMessage());

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

        }
    }
}

Fora que o seu metodo estaria fazendo duas coisas … tente não fazer isso, programe limpo ! uma responsabilidade por metodo.

Maureli

Obrigado pela ajuda, fiz as alterações mas estou recebendo o seguinte erro:

ERRO: duplicar valor da chave viola a restrição de unicidade "cliente_pkey"

public class JDBCUpdate {
    public void alterar(Cliente cli){
     Connection update = PostgreSQL.getConnection();

     try{
         String sql = ("Update cliente set id_cliente=?, nome=?, cpf=?");

         PreparedStatement stmt = update.prepareStatement(sql);
         Cliente cliente = new Cliente();
         //Endereco endereco = new Endereco();

         stmt.setInt(1, cliente.getId());
         stmt.setString(2, cliente.getNome());
         stmt.setLong(3, cliente.getCpf());

//         stmt.setInt(4, endereco.getId());
//         stmt.setString(5, endereco.getRua());
//         stmt.setInt(6, endereco.getNumero());
//         stmt.setString(7, endereco.getComplemento());



         stmt.executeUpdate();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "erro ao fazer o Update " + e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                update.close();
            } catch (SQLException ex) {
                Logger.getLogger(JDBCCriarTabela.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
}
O

Boa Tarde,
Amigo, Sou Novato porém
Aparentemente você está tentando atualizar o valor de uma Primary Key, tenta dar um update apenas nos dados de nome e CPF…

Abs…

Maureli

Mas se eu não passar a Primary key, como o Update vai pegar a linha certa para atualizar?

O

“Update cliente set nome=?, cpf=? where id_cliente=?”

Maureli

Fiz as modificações

public class JDBCUpdate {
    public void alterar(Cliente cli){
     Connection update = PostgreSQL.getConnection();

     try{
         String sql = ("Update cliente set nome=?, cpf=? where id_cliente = ?");

         PreparedStatement stmt = update.prepareStatement(sql);
         Cliente cliente = new Cliente();
         //Endereco endereco = new Endereco();

         
         stmt.setString(1, cliente.getNome());
         stmt.setLong(2, cliente.getCpf());
         stmt.setInt(3, cliente.getId());
         
//         stmt.setInt(4, endereco.getId());
//         stmt.setString(5, endereco.getRua());
//         stmt.setInt(6, endereco.getNumero());
//         stmt.setString(7, endereco.getComplemento());



         stmt.executeUpdate();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "erro ao fazer o Update " + e.getMessage());
            e.printStackTrace();
        } finally {
            try {
                update.close();
            } catch (SQLException ex) {
                Logger.getLogger(JDBCCriarTabela.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }
}

Aqui eu passo os parâmetros para ser feito o Update

public void alterar(){

        Cliente cliente = new Cliente();
        //Endereco endereco = new Endereco();

        int num = 2;

       
        cliente.setNome("João Maureli");
        cliente.setCpf(999999999);
        cliente.setId(num);
//        endereco.setId(num);
//        endereco.setNumero(10);
//        endereco.setRua("Ipiranga");
//        endereco.setComplemento("Bloco A");

        JDBCUpdate update = new JDBCUpdate();

        update.alterar(cliente);

        
    }

    }

Está rodando normal, mas não faz o UPDATE no Banco de Dados.

Maureli

Já fiz todos os Debugs possíveis. Os atributos recebem o valor passado por parametros, Mas o mesmo não atualiza no Banco de Dados.

furutani

O commit é automático?
Se não for, dá um update.commit(); depois do stmt.executeUpdate();

Maureli

Meu cpf é do tipo long, no banco ele é do tipo Integer, eu estou passando por parametro um Integer,

Porque ele considera a expressão como tipo character varying. Alguem já teve esse problema?

org.postgresql.util.PSQLException: ERRO: coluna cpf é do tipo integer mas expressão é do tipo character varying

at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)

at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)

at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)

at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)

at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
Maureli

Alguem tem alguma dica?

Maureli

Consegui resolver o problema.

O erro estava na referência para o Objeto.

public void alterar(Cliente cli){
     Connection update = PostgreSQL.getConnection();

     try{
         String sql = ("Update cliente set nome=?, cpf=? where id_cliente = ?");

         PreparedStatement stmt = update.prepareStatement(sql);
         //Cliente cliente = new Cliente();
         //Endereco endereco = new Endereco();

         stmt.setInt(3, cli.getId());      // Aqui estava o erro, eu estava usando cliente.getId(), mas cliente referenciava um Objeto null.
         stmt.setString(1, cli.getNome());
         stmt.setLong(2, cli.getCpf());
        

            //         stmt.setInt(4, endereco.getId());
            //         stmt.setString(5, endereco.getRua());
            //         stmt.setInt(6, endereco.getNumero());
            //         stmt.setString(7, endereco.getComplemento());
           stmt.executeUpdate();
           update.commit();
Criado 15 de fevereiro de 2011
Ultima resposta 23 de fev. de 2011
Respostas 11
Participantes 4