Problema ao criar botão( com o código de alterar) no formulario (Feito com jFrame). [RESOLVIDO]

14 respostas
X

Eu fiz um formulário fiz o botão de salvar (com o código... ate aki deu tua certo...) Agora tentei fazer o botão com o código de alterar, mais eu não faço ideia de como fazer(tudo que tentei da erro de Syntax SQL).

Meu código de editar é esse:

String driver = "com.mysql.jdbc.Driver"; //Classe do driver JDBC
           String banco = "pdt"; //Nome do Banco criado
           String host = "localhost"; //Maquina onde está o banco
           String str_conn = "jdbc:mysql://" + host + ":3306/" + banco; //URL de conexão
           String usuario = "root"; //Usuário do banco
           String senha = ""; //Senha de conexão

           
           try {
               Class.forName(driver); //Carrega o driver

               //Obtém a conexão com o banco
               java.sql.Connection conn = DriverManager.getConnection(str_conn, usuario, senha);

               //Cria um statement para podermos mandar um SQL para o banco
               java.sql.Statement stmt = conn.createStatement();


               //Mandamos o SQL para o banco e obtemos um ResultSet
            String sql ="UPDATE cadastroaluno SET nome ='"+jTextField2.getText()+"',"+  
               "email = '" +jTextField3.getText()+"',"+  
               "rg= '" +jTextField4.getText()+"',"+  
               "fone = '" +jTextField5.getText()+"',"+  
               " nome_responsavel= '" +jTextField6.getText()+"',"+  
               "telefone_responsavel = '" +jTextField7.getText()+"',"+  
                " where matricula = '"+Integer.parseInt(jTextField1.getText())+"'";
            
             
 //con_setor.statement.executeUpdate(sqlinsert);

           stmt.executeUpdate(sql);
           //ResultSet rs = stmt.executeQuery(sql);

               String sql2 = "SELECT * FROM cadastroaluno";
               ResultSet rs = stmt.executeQuery(sql2);

           DefaultTableModel modelo = (DefaultTableModel) jTable2.getModel();
           modelo.setNumRows(0);
          // rs.first();
               //Percorrendo o ResultSet e obtendo os valores do banco
              while (rs.next()) {
                    System.out.println(rs.getString("matricula"));
                    System.out.println(rs.getString("nome"));
                    System.out.println(rs.getString("email"));
                    System.out.println(rs.getString("rg"));
                    System.out.println(rs.getString("fone"));
                    System.out.println(rs.getString("nome_responsavel"));
                    System.out.println(rs.getString("telefone_responsavel"));
                    modelo.addRow(new Object [] {rs.getString("matricula"), rs.getString("nome"), rs.getString("email"), rs.getString("rg"), rs.getString("fone"), rs.getString("nome_responsavel"), rs.getString("telefone_responsavel")});

                    System.out.println("====================================");
                    jTextField1.setText(rs.getString("matricula"));
                    jTextField2.setText(rs.getString("nome"));
                    jTextField3.setText(rs.getString("email"));
                    jTextField4.setText(rs.getString("rg"));
                    jTextField5.setText(rs.getString("fone"));
                    jTextField6.setText(rs.getString("endereco"));
                    jTextField8.setText(rs.getString("nome_responsavel"));
                    jTextField9.setText(rs.getString("email_responsavel"));
                    jTextField10.setText(rs.getString("telefone_responsavel"));
                    //jTextField11.setText(rs.getString("celular_responsavel"));

             }
         
        }
        catch (ClassNotFoundException ex) {
             System.out.println("Não foi possível carregar o driver.");
             ex.printStackTrace();
        }
        catch (SQLException ex) {
             System.out.println("Problema com o SQL");
             ex.printStackTrace();
       }

Onde está o erro???

14 Respostas

ViniGodoy

O que fazer nesses casos é:
a) Abrir sua dúvida no fórum de Persistência (já que a dúvida é de banco de dados) ou Interface Gráfica (se fosse no Swing), e não no de Java Básico (já movi o tópico);
b) Usar PreparedStatement e retirar o SQL do seu código Java.
c) Se o código é de editar, então escrever a query de UPDATE e não de INSERT.

X

O erro é de Syntax então pensei que devia colocar aki… (Sou novo no fórum…rs)
Valeu por mover o tópico…

Não entendi esse link que vc mando, pelo mesmo problema que não estou conseguindo fazer o editar, pois todos os exemplos são de valores declarado e não que recebi externamente, como pelo jTextField…

PS: o código que está la em cima agora é o de editar (antes era o de salvar…rss).

O que está errado??

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 matricula = ‘123’’ at line 1

ViniGodoy

Se matricula é um número, então não deveria estar com aspas simples.

Outra coisa, esforce-se para entender o PreparedStatement. O fato de ser um valor declarado ou não é irrelevante. O que vai mudar é apenas que, ao invés de vc atribuir o valor diretamente, você vai le-lo do JTextField:

String x = "Vinicius"; int idade = 10;
Ou então, lendo do JTextField:

String x = txtNome.getText(); int idade = Integer.parseInt(txtIdade.getText());

Com o PreparedStatement, você jamais precisa se preocupar com aspas simples, formatos de datas, se usa pontinho ou vírgula para números com casas decimais. Também não dá problema se seu usuário fornecer de nome “MacDonald’s” (note que uma aspas simples no nome faria estrago no seu código), ou mesmo ataque diretamente seu software digitando parte de uma SQL em um dos campos (um ataque conhecido como SQL Injection). O código com o PreparedStatement fica, no final, sem concatenações e mais fácil de entender. Ou seja, é mais simples de usar, mais claro e ainda mais seguro. :slight_smile:

X

fica assim né??

String sql ="UPDATE cadastroaluno SET nome ='"+jTextField2.getText()+"',"+ "email = '" +jTextField3.getText()+"',"+ "rg= '" +jTextField4.getText()+"',"+ "fone = '" +jTextField5.getText()+"',"+ " nome_responsavel= '" +jTextField6.getText()+"',"+ "telefone_responsavel = '" +jTextField7.getText()+"',"+ " where matricula = "+Integer.parseInt(jTextField1.getText())+"";

Mais o erro continua…
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 matricula = 123’ at line 1

Ps: eu vó estudar PreparedStatement sim… VLW pela dica!!!

helder.emiliano

String sql ="UPDATE cadastroaluno SET nome ='"+jTextField2.getText()+"',"+ "email = '" +jTextField3.getText()+"',"+ "rg= '" +jTextField4.getText()+"',"+ "fone = '" +jTextField5.getText()+"',"+ " nome_responsavel= '" +jTextField6.getText()+"',"+ "telefone_responsavel = '" +jTextField7.getText()+"'"+ " where matricula = "+Integer.parseInt(jTextField1.getText())+"";

Copie e cole la e vera que seu problema foi resolvido, ou pelo menos este problema, Como o próprio erro ja diz é um erro de sintaxe e você colocou uma virgula antes do where, isto que esta ocasionando o erro…

ViniGodoy

Outro erro é que você continua usando o Statement, e não o PreparedStatement.
Isso é considerado uma falha grave de segurança no seu sistema.

X

ViniGodoy:
Outro erro é que você continua usando o Statement, e não o PreparedStatement.
Isso é considerado uma falha grave de segurança no seu sistema.

O Programa é uma projeto da escola (e ja estou atrasado).
Quando acabar eu fasso com PreparedStatement e atualizo… . Não é só isso meu, código não ta bom(tenho que melhorar muita coisa)… vou ajeitar tudo, mais eu tenho que entregar alguma coisa pra escola…

BLZ??

ViniGodoy

Já que você está com preguiça de estudar e ver como se faz do jeito certo, vou postar um exemplo para você:

Class.forName(driver); //Carrega o driver  
  
//Obtém a conexão com o banco  
Connection conn = DriverManager.getConnection(str_conn, usuario, senha);  

//Cria o result set  
String sql = 
    "UPDATE cadastroaluno " +
    " SET nome=?, email=?, rg=?, fone=?, nome_responsavel=?, telefone_responsavel=?" +
    " WHERE matricula=?";
PreparedStatement stmt = conn.prepareStatement(sql);

//Carrega nele os parâmetros
stmt.setString(1, jTextField2.getText());
stmt.setString(2, jTextField3.getText());
stmt.setString(3, jTextField4.getText());
stmt.setString(4, jTextField5.getText());
stmt.setString(5, jTextField6.getText());
stmt.setString(6, jTextField7.getText());
stmt.setInt(7, Integer.parseInt(jTextField1.getText()));

//Manda pro banco e executa
stmt.executeUpdate();

Note que agora é 500x mais fácil ler o SQL, e você não terá mais problemas ao cadastrar o usuário "Jack Macdonald's".

ViniGodoy

xandi_m5:
O Programa é uma projeto da escola (e ja estou atrasado).
Quando acabar eu fasso com PreparedStatement e atualizo… . Não é só isso meu, código não ta bom(tenho que melhorar muita coisa)… vou ajeitar tudo, mais eu tenho que entregar alguma coisa pra escola…

Isso jamais foi desculpa para ser desleixado.
Como eu já falei, o PreparedStatement é mais fácil de usar. Você verá com mais facilidade a SQL e deixará de ter problemas bobos como os desse tópico (quanto tempo você perdeu tentando corrigir as aspas simples?).
A concatenação deixa o código muito ruim de ler, e susceptível a erros. Se eu fosse seu professor, já de cara tentaria cadastrar alguma coisa com apóstrofe, só para ver se seu programa dava pau.

E o seu vai dar.

X

Isso jamais foi desculpa para ser desleixado.
Como eu já falei, o PreparedStatement é mais fácil de usar. Você verá com mais facilidade a SQL e deixará de ter problemas bobos como os desse tópico (quanto tempo você perdeu tentando corrigir as aspas simples?).
A concatenação deixa o código muito ruim de ler, e susceptível a erros. Se eu fosse seu professor, já de cara tentaria cadastrar alguma coisa com apóstrofe, só para ver se seu programa dava pau.

E o seu vai dar.

Vc está certo.
Mais eu nuca tinha visto o Statement, fica dificil saber…
Ja estou ajeitando meu programa… :smiley:

VLW pelo aviso…!!!

X
ViniGodoy:
Já que você está com preguiça de estudar e ver como se faz do jeito certo, vou postar um exemplo para você:
Class.forName(driver); //Carrega o driver  
  
//Obtém a conexão com o banco  
Connection conn = DriverManager.getConnection(str_conn, usuario, senha);  

//Cria o result set  
String sql = 
    "UPDATE cadastroaluno " +
    " SET nome=?, email=?, rg=?, fone=?, nome_responsavel=?, telefone_responsavel=?" +
    " WHERE matricula=?";
PreparedStatement stmt = conn.prepareStatement(sql);

//Carrega nele os parâmetros
stmt.setString(1, jTextField2.getText());
stmt.setString(2, jTextField3.getText());
stmt.setString(3, jTextField4.getText());
stmt.setString(4, jTextField5.getText());
stmt.setString(5, jTextField6.getText());
stmt.setString(6, jTextField7.getText());
stmt.setInt(7, Integer.parseInt(jTextField1.getText()));

//Manda pro banco e executa
stmt.executeUpdate();

Note que agora é 500x mais fácil ler o SQL, e você não terá mais problemas ao cadastrar o usuário "Jack Macdonald's".

Da pra mim fazer a classe DAO e só chamar no botão????

ViniGodoy

Sim.

X

Como?
Tentei e da erro… pois não posso “chamar” o JtextField nela…

ViniGodoy

Você tem que passar os dados por parâmetro:

public class AlunoDao {
   public void atualizar(int matricula, String nome, String email, String rg, String fone, String responsavel, String foneResponsavel) 
   throws SQLException {
       //Obtém a conexão com o banco    
       Connection conn = DriverManager.getConnection(str_conn, usuario, senha);    
  
       //Cria o result set    
       String sql =   
           "UPDATE cadastroaluno " +  
           " SET nome=?, email=?, rg=?, fone=?, nome_responsavel=?, telefone_responsavel=?" +  
           " WHERE matricula=?";  
       PreparedStatement stmt = conn.prepareStatement(sql);  
         
       //Carrega nele os parâmetros  
       stmt.setString(1, nome);  
       stmt.setString(2, email);  
       stmt.setString(3, rg);  
       stmt.setString(4, fone);  
       stmt.setString(5, responsavel);  
       stmt.setString(6, foneResponsavel);  
       stmt.setInt(7, matricula);  
         
       //Manda pro banco e executa  
       stmt.executeUpdate();  
   }
}
E no seu método:
new AlunoDao().atualizar(
   Integer.parseInt(jTextField1.getText()),
   jTextField2.getText(), jTextField3.getText(), jTextField4.getText(), jTextField5.getText(),
   jTextField6.getText(), jTextField7.getText()
);
Criado 29 de setembro de 2011
Ultima resposta 30 de set. de 2011
Respostas 14
Participantes 3