[RESOLVIDO]Upadate nao esta funcionado e nao gera erro

18 respostas
M

Galera estou com problemas com update com relação aqui vai meu código.

Esta dano dando problema no endereço

Aqui vai o código

public void altera(Cliente c1) throws SQLException{
         
         String sql = "update cliente set nome =?,"+
                  "telefone =?,cpf =? , email =?,datanascimento = ?, observacao=? "+
                  " where codcliente = ?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        //seta os valores
        
        stmt.setString(1,c1.getNome());
        stmt.setString(2,c1.getTelefone());
        stmt.setString(3,c1.getCpf());
        stmt.setString(4,c1.getEmail());
        stmt.setString(5,c1.getDataFormatada());
        stmt.setString(6, c1.getObservacao());
        stmt.setInt(7,c1.getCodcliente());
        //Executa o código sql 
        stmt.execute();
        stmt.close();
        
         
        String sql1 = "update Endereco set "+
             "endereco =?,cidade = ?,uf =?, where fkendereco = ?";
      PreparedStatement stmt1 = conexao.prepareStatement(sql1);
        
     
      stmt1.setString(1, c1.getEndereco().getEndereco());
      stmt1.setString(2, c1.getEndereco().getCidade());
      stmt1.setString(3, c1.getEndereco().getUf());
      stmt1.setInt(4, c1.getEndereco().getIdEndereco());  
      stmt1.execute();
      stmt1.close();
       
     }

Aqui esta o erro

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where fkendereco = 0' at line 1

Talvez tmb seja o jeito que estou manipulando o update.

Espero que alguém me ajude.Obrigado.

18 Respostas

V

o campo “fkendereco” existe dentro da tabela “Endereco” ?

procure também colocar os acentos para separar assim :

String sql1 = "UPDATE `Endereco` SET `endereco` =?,`cidade` = ?,`uf` =? WHERE `fkendereco` = ?"

alem disso objserve no endereço você está colocando um integer esse campo ele é um integer mesmo ? ou é uma string ?

eu não sei quanto a você mas eu não gosto muito de usar o PreparedStatement a menos que eu precise usar ele, eu gosto de montar a minha query na mão toda

a vantagem de fazer é se a query der um erro como o seu eu posso pegar a query toda e executar ela fora da minha aplicação direto no servidor

String sql1 = "UPDATE `Endereco` SET `endereco` ="+c1.getEndereco().getEndereco()+",`cidade` = "+c1.getEndereco().getCidade()+",`uf` ="+c1.getEndereco().getUf()+" WHERE `fkendereco` = " + c1.getEndereco().getIdEndereco() + " ;"

assim eu posso pegar o valor do “sql1” imprimir ele e ver se a sintaxe está correta

drsmachado

Victor Gerin:
o campo “fkendereco” existe dentro da tabela “Endereco” ?

procure também colocar os acentos para separar assim :

String sql1 = "UPDATE `Endereco` SET `endereco` =?,`cidade` = ?,`uf` =?, WHERE `fkendereco` = ?"

alem disso objserve no endereço você está colocando um integer esse campo ele é um integer mesmo ? ou é uma string ?


Povo desatento.
Tem uma vírgula antes da palavra WHERE. Essa é a causa do erro.

V

vish desculpa aew se não vi

drsmachado

Eu sempre analiso a forma como a query está (quando é possível, já vi cada coisa).
Isso é um ato que aprendi por ter errado de formas parecidas a esta, então, é normal.
Só depois de me certificar da coerência e adequação da String que fará a consulta é que parto para a questão dos campos.
Além do mais, a mensagem dizia que o erro era na sintaxe e não que uma coluna não existia ou um parâmetro estava errado.

M

Obrigado mesmo,mas eu tinha analisado varias vezes,uma coisa tão simples dessa.

Mas o problema persiste , quando eu vó alterar esta tudo certo, não esta dano mas nenhum erro.

Mas não esta alterando.

Mudei a fkcliente que esta na tabela endereço mas nada ainda, será
qual e o problema?

Segue o código abaixo

public void altera(Cliente c1) throws SQLException{
         
         String sql = "update cliente set nome =?,"+
                  "telefone =?,cpf =? , email =?,datanascimento = ?, observacao=? "+
                  " where codcliente = ?";
        PreparedStatement stmt = conexao.prepareStatement(sql);
        //seta os valores
        
        stmt.setString(1,c1.getNome());
        stmt.setString(2,c1.getTelefone());
        stmt.setString(3,c1.getCpf());
        stmt.setString(4,c1.getEmail());
        stmt.setString(5,c1.getDataFormatada());
        stmt.setString(6, c1.getObservacao());
        stmt.setInt(7,c1.getCodcliente());
        //Executa o código sql 
        stmt.execute();
        stmt.close();
        
         
        String sql1 = "update Endereco set "+
             "endereco =?,cidade = ?,uf =? where fkcliente = ?";
      PreparedStatement stmt1 = conexao.prepareStatement(sql1);
        
     
      stmt1.setString(1, c1.getEndereco().getEndereco());
      stmt1.setString(2, c1.getEndereco().getCidade());
      stmt1.setString(3, c1.getEndereco().getUf());
      stmt1.setInt(4, c1.getEndereco().getIdEndereco());  
      stmt1.execute();
      stmt1.close();
       
     }

Que estranho.

Obrigado por estarem me ajudando.

V

faça o que eu disse

monte a query toda você mesmo

String sql1 = "UPDATE `Endereco` SET `endereco` ="+c1.getEndereco().getEndereco()+",`cidade` = "+c1.getEndereco().getCidade()+",`uf` ="+c1.getEndereco().getUf()+" WHERE `fkendereco` = " + c1.getEndereco().getIdEndereco() + " ;"

e imprima o resultado dessa quer na tela,

out.println(sql1);

como eu disse fazendo assim você pode testa a query sem se preocupar com o problema ser ou não da aplicação

eu geralmente faço isso dai pego o resultado e jogo ele no phpMyAdmin e testo a query perada depois se ela funcionar quer dizer que o problema e na sua aplicação se ele não funcionar quer dizer que é problema na query e por ela está montada você consegue analisar a sintaxe da query melhor

M

Victor Gerin:
faça o que eu disse

monte a query toda você mesmo

String sql1 = "UPDATE `Endereco` SET `endereco` ="+c1.getEndereco().getEndereco()+",`cidade` = "+c1.getEndereco().getCidade()+",`uf` ="+c1.getEndereco().getUf()+" WHERE `fkendereco` = " + c1.getEndereco().getIdEndereco() + " ;"

e imprima o resultado dessa quer na tela,

out.println(sql1);

como eu disse fazendo assim você pode testa a query sem se preocupar com o problema ser ou não da aplicação

eu geralmente faço isso dai pego o resultado e jogo ele no phpMyAdmin e testo a query perada depois se ela funcionar quer dizer que o problema e na sua aplicação se ele não funcionar quer dizer que é problema na query e por ela está montada você consegue analisar a sintaxe da query melhor

Cara eu fiz o que vc me diz esta tudo certo. Mas so que a fk esta me retornando 0, não sei se e o certo.

Aqui esta o resultado

UPDATE `Endereco` SET `endereco` =CasaBranca,`cidade` = norte,`uf` =AC WHERE `fkendereco` = 0Conectando ao banco

Cara o pior que esta tudo certo eu acho , não deu nenhum erro.

Obrigado

V

então vemos que o problema não é mais na query mas sim na sua aplicação então de uma olhada, pois a variável “c1.getEndereco().getIdEndereco()” não deve ter sido inicializada

M

Eu estou vendo aqui mas não consigo achar esse erro de inicialização.

Aqui esta minha classe controle

public void altera(String nome,String telefone,String cpf,String email,Date datanascimento,String observacao,String endereco,String cidade,String uf) throws SQLException  {
       System.out.println("Controlador executano funcao de Alterar");
      
      Endereco novoEndereco = new Endereco();  
       
      novoEndereco.setEndereco(endereco) ; 
      novoEndereco.setCidade(cidade) ; 
      novoEndereco.setUf(uf) ;  
     
      
      Cliente novoCliente   = new Cliente();           
      novoCliente.setNome(nome) ;
      novoCliente.setTelefone(telefone); 
      novoCliente.setCpf(cpf);
      novoCliente.setEmail(email); 
      novoCliente.setDatanascimento(datanascimento); 
      novoCliente.setObservacao(observacao); 
      novoCliente.setEndereco(novoEndereco);
  
       ClienteDAO dao = new ClienteDAO();
       dao.altera(novoCliente);
    
   }

E o botão Alterar

ControladorCliente    controle = new ControladorCliente();

            String nome = this.jTNome.getText();
            String telefone = this.jFTelefone.getText();
            String cpf = this.jFCPF.getText();
            String email = this.jTEmail.getText();
            Date  datanascimento = new java.util.Date(this.jFDatanascimento.getText());
            String observacao = this.jTObservacao.getText();
            String endereco = this.jTEndereco.getText();
            String cidade = this.jTCidade.getText();
            String uf = this.jComboBoxUf.getSelectedItem().toString();
     
            
        try {
            controle.altera(nome, telefone, cpf, email,datanascimento , observacao, endereco, cidade,uf);
        } catch (SQLException ex) {
            Logger.getLogger(janelaEditarCliente.class.getName()).log(Level.SEVERE, null, ex);
        }

      JOptionPane.showMessageDialog(null, "Cadastro Alerado com sucesso!!");
      this.dispose(); 
       new JanelaConsultar().setVisible(true);   
                                          
    }

Os dados que eu pego vem de outra tabela,para min só limpar e alterar.

eu não coloquei os id pq e autoincrement né.ou será que o problema esta ai?.

Deve ser alguma coisa bem simples que eu ate agora não percebi , mas esta difícil pacas.

Obrigado por estar me ajudando.

drsmachado

Victor Gerin:
faça o que eu disse

monte a query toda você mesmo

String sql1 = "UPDATE `Endereco` SET `endereco` ="+c1.getEndereco().getEndereco()+",`cidade` = "+c1.getEndereco().getCidade()+",`uf` ="+c1.getEndereco().getUf()+" WHERE `fkendereco` = " + c1.getEndereco().getIdEndereco() + " ;"

e imprima o resultado dessa quer na tela,

out.println(sql1);

como eu disse fazendo assim você pode testa a query sem se preocupar com o problema ser ou não da aplicação

eu geralmente faço isso dai pego o resultado e jogo ele no phpMyAdmin e testo a query perada depois se ela funcionar quer dizer que o problema e na sua aplicação se ele não funcionar quer dizer que é problema na query e por ela está montada você consegue analisar a sintaxe da query melhor


Nunca, jamais, em tempo algum, por qualquer razão que seja, cometa essa atrocidade.
Você tem uma estrutura prática e que visa tratar de forma preventiva a possibilidade de injeção de SQL na aplicação, que é o preparedStatement.
Fazer o que você sugeriu é errado e grosseiro. Ok?
Quando se tem dúvidas sobre o que está fazendo, reescreve-se a query e executa-a em um gerenciador do banco de dados (pode ser no prompt mesmo ou algum app para isto), mas nunca modifica-se a estrutura do que está na aplicação java.
Quanto a não alterar, você deve fazer um SELECT e ver se existe algum registro (em específico o que você quer alterar) e ver qual é o valor da coluna fkendereco.
Lembre-se, quando uma instrução UPDATE é executada e nenhum registro coincide com os filtros do WHERE, não ocorre atualização nenhuma.

drsmachado

Victor Gerin:
faça o que eu disse

monte a query toda você mesmo

String sql1 = "UPDATE `Endereco` SET `endereco` ="+c1.getEndereco().getEndereco()+",`cidade` = "+c1.getEndereco().getCidade()+",`uf` ="+c1.getEndereco().getUf()+" WHERE `fkendereco` = " + c1.getEndereco().getIdEndereco() + " ;"

e imprima o resultado dessa quer na tela,

out.println(sql1);

como eu disse fazendo assim você pode testa a query sem se preocupar com o problema ser ou não da aplicação

eu geralmente faço isso dai pego o resultado e jogo ele no phpMyAdmin e testo a query perada depois se ela funcionar quer dizer que o problema e na sua aplicação se ele não funcionar quer dizer que é problema na query e por ela está montada você consegue analisar a sintaxe da query melhor


Nunca, jamais, em tempo algum, por qualquer razão que seja, cometa essa atrocidade.
Você tem uma estrutura prática e que visa tratar de forma preventiva a possibilidade de injeção de SQL na aplicação, que é o preparedStatement.
Fazer o que você sugeriu é errado e grosseiro. Ok?
Quando se tem dúvidas sobre o que está fazendo, reescreve-se a query e executa-a em um gerenciador do banco de dados (pode ser no prompt mesmo ou algum app para isto), mas nunca modifica-se a estrutura do que está na aplicação java.
Quanto a não alterar, você deve fazer um SELECT e ver se existe algum registro (em específico o que você quer alterar) e ver qual é o valor da coluna fkendereco.
Lembre-se, quando uma instrução UPDATE é executada e nenhum registro coincide com os filtros do WHERE, não ocorre atualização nenhuma.

Edit:
Veja, também, todo o processo que leva a tal fkendereco até a rotina que tenta realizar o update. Se está chegando ‘0’ é por que esse valor está sendo definido em alguma das etapas anteriores.

M

E muito estranho ,o pior que na minha consulta ele consta o valor da id ai quando passa para outra jframe o valor tmb e passado , mas só que não tenho esse campo , motivo pq e auto incremento será que e por causa disso?mesmo assim ele tinha que reconhecer pq estou pegando do banco.
e tmb já vi um fórum daqui que tmb não foi resolvido,mas esses caso são raros, primeira vez q acontece comigo.

M

Velho esta foda isso já estou a 2 dias to quebrando muito a cabeça mas nada ate agora.

Preciso que alguém me ajude

drsmachado

Camarada, já te disse, você nunca vai conseguir fazer update em um registro se o valor que está passando para comparação é 0.
Como já disse, também, precisa rever todo o processo antes do update e ver onde é que o valor é zerado.

M

Veja eu passo todos os componentes da consulta para o editar como mostra aqui nos código.

Aqui minha consulta onde eu clica em editar e passa todos os valores para o outro jfreme editar

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

int codigo = (int)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),0);        
String nome = (String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),1);
String telefone = (String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),2) ;
String cpf = (String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),3) ;
String email = (String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),4);
String datanascimento = (String) jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),5) ;
String observacao =(String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),6 );
String endereco = (String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),7);
String cidade = (String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),8);
String uf = (String)jTTabela.getModel().getValueAt(jTTabela.getSelectedRow(),9);
        
janelaEditarCliente jc = new janelaEditarCliente(codigo,nome, telefone,cpf,email, datanascimento,observacao,endereco,cidade,uf);
jc.setVisible(true);
              
              
           
    
    }

Aqui seria meu jframe editar,meu id já esta sendo passado,n precisa esta num textfield

public final class janelaEditarCliente extends javax.swing.JFrame {

    public janelaEditarCliente() {
        initComponents();
        

    }

    public janelaEditarCliente(int id,String nome,String telefone,
            String cpf,String email,String datanascimento,
            String observacao,String endereco,String cidade,String uf)  {
        initComponents();
     
        
        this.jTNome.setText(nome);
        this.jFTelefone.setText(telefone);
        this.jFCPF.setText(cpf);
        this.jTEmail.setText(email);
        
        jFDatanascimento.setText(datanascimento);
        
        this.jTObservacao.setText(observacao);
        this.jTEndereco.setText(endereco);
        this.jTCidade.setText(cidade);
        this.jComboBoxUf.setSelectedItem(uf);

Aqui meu dao q altera

public void altera(Cliente c1) throws SQLException{
     
         String sql = "update cliente set cliente.nome =?,"+
                  "cliente.telefone =?,cliente.cpf =? , cliente.email =?,cliente.datanascimento = ?, cliente.observacao=? "+
                  " where cliente.codcliente = cliente.codcliente= ?";
           try (PreparedStatement stmt = conexao.prepareStatement(sql)) {
               stmt.setString(1,c1.getNome());
               stmt.setString(2,c1.getTelefone());
               stmt.setString(3,c1.getCpf());
               stmt.setString(4,c1.getEmail());
               stmt.setString(5,c1.getDataFormatada());
               stmt.setString(6, c1.getObservacao());
               stmt.setInt(7,c1.getCodcliente());
         
               
               System.out.print(stmt);
               //Executa o código sql 
               stmt.execute();
           }

Aqui meu construtor altera

public void altera(String nome,String telefone,String cpf,String email,Date datanascimento,String observacao,String endereco,String cidade,String uf) throws SQLException  {
          System.out.println("Controlador  Alterar");
      
      Endereco novoEndereco = new Endereco();  
       
      novoEndereco.setEndereco(endereco) ; 
      novoEndereco.setCidade(cidade) ; 
      novoEndereco.setUf(uf) ;  
     
      
      Cliente novoCliente   = new Cliente(); 
   
      novoCliente.setNome(nome) ;
      novoCliente.setTelefone(telefone); 
      novoCliente.setCpf(cpf);
      novoCliente.setEmail(email); 
      novoCliente.setDatanascimento(datanascimento); 
      novoCliente.setObservacao(observacao); 
      novoCliente.setEndereco(novoEndereco);
  
       ClienteDAO dao = new ClienteDAO();
       dao.altera(novoCliente);
    
   }

Agora me diz como que ele não estaria pegando o valor do código?
Talvez seja o método altera ,pq esta muito estranho, esta tudo certo ao meu ver.

drsmachado

Camarada, se você não disser quem ele deve alterar, como ele vai alterar?

Cliente novoCliente   = new Cliente();   
     
      novoCliente.setNome(nome) ;  
      novoCliente.setTelefone(telefone);   
      novoCliente.setCpf(cpf);  
      novoCliente.setEmail(email);   
      novoCliente.setDatanascimento(datanascimento);   
      novoCliente.setObservacao(observacao);   
      novoCliente.setEndereco(novoEndereco);  
    
       ClienteDAO dao = new ClienteDAO();  
       dao.altera(novoCliente);

Veja que no trecho acima não há em nenhuma das linhas um novoCliente.setCodigo(codigoDoClienteASerAlterado);
É isso que causa o teu problema.

M

Muito obrigado dsmachado e vitor,consegui resolver aqui.

RESOLVIDO

karlaille

Seguinte! estou com o mesmo problema, com a mesma mensagem de erro, parte do problema esta resolvido, consegui constatar que esse problema só ocorre quando se tenta fazer update em mais de 6 colunas, estou trabalhando para resolver o impasse, outra coisa retire a clausula WHERE até resolução do problema seja feita.

Criado 15 de julho de 2013
Ultima resposta 13 de dez. de 2013
Respostas 18
Participantes 4