[RESOLVIDO]Upadate nao esta funcionado e nao gera erro

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.

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

[quote=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 ?[/quote]
Povo desatento.
Tem uma vírgula antes da palavra WHERE. Essa é a causa do erro.

vish desculpa aew se não vi

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.

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.

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

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

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

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

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.

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

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

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.

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

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.

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.

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.

Muito obrigado dsmachado e vitor,consegui resolver aqui.

RESOLVIDO

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.