DELETE não funciona (RESOLVIDO)

5 respostas
K

Quero excluir um registro do banco de dados MySql referente a linha do JTable que eu clicar, mas não está funcionando. Alguém pode me ajudar?

Aparece o seguinte erro:
Erro:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column ‘KMM002060’ in ‘where clause’

‘KMM002060’ é o valor da celula que cliquei.

Segue o código:

JTableDados.addMouseListener(new java.awt.event.MouseAdapter() {
   public void mouseClicked(java.awt.event.MouseEvent evt) {
   String valorSelecionado = JTableDados.getValueAt(JTableDados.getSelectedRow(),JTableDados.getSelectedColumn()).toString();
   int status = JOptionPane.showConfirmDialog(null,"Deseja excluir o item "+valorSelecionado+ "?","CRD - Atenção",JOptionPane.YES_NO_OPTION);
   if (status == JOptionPane.YES_OPTION) {       
   try
   {
   String url = "jdbc:mysql://localhost:3306/crd";
   String usuario = "root";
   String senha = "210683";
   Class.forName("com.mysql.jdbc.Driver");
   Connection con;
   con = DriverManager.getConnection(url,usuario,senha);
   Statement st = con.createStatement();
    st.executeUpdate("DELETE FROM Equipamentos WHERE Serie = "+valorSelecionado);
   int[] l = JTableDados.getSelectedRows();   
   javax.swing.table.DefaultTableModel dtm = (javax.swing.table.DefaultTableModel)JTableDados.getModel();	
   for(int i = 0; i < l.length; i++)   
   dtm.removeRow(l[i] - i);
   st.close();
   con.close();	
   JTextFieldSerie.setText("");
   }catch(Exception event){
   JOptionPane.showMessageDialog(null,"Não foi possível estabelecer conexão com o banco de dados!","CRD",JOptionPane.ERROR_MESSAGE);
   System.err.println("Erro:" + event);
   }
   }       
   }});

5 Respostas

P

O campo serie dever ser um varcher e vc não esta colocando aspas simples na sql, tente substituir a linha 15 por iss

st.executeUpdate(“DELETE FROM Equipamentos WHERE Serie = '”+valorSelecionado+"’");

M

Procure por PreparedStatement. Mais simples, legível e seguro.

K

paulomd
Valeu. Deu certo. Me quebrou uma árvore.

marcobiscaro2112

Pq o PreparedStatement é mais seguro?
Pode me explicar como usar?

M

KRAUSER:
paulomd
Valeu. Deu certo. Me quebrou uma árvore.

marcobiscaro2112

Pq o PreparedStatement é mais seguro?
Pode me explicar como usar?

Porque evita códigos maliciosos, que nas mãos de um usuário mal intencionado pode ser bem arriscado. No caso, nem tanto, porque é obrigatório usar as aspas simples, o que separa os argumentos. Mas imagine a situação: em um BD com 130 mil registros o sujeito abre a tela para remover um registro. Lá, pede-se o nome do usuário que irá ser removido (deve ser digitado em um JTextField). E vai lá o infeliz e digita:

“joao OR 1 = 1”

Pronto! Seu BD foi pro saco! Sua consulta ficaria assim:

st.executeUpdate(“DELETE FROM usuarios WHERE nome = “+valorSelecionado+””);

E substituindo os valores:

st.executeUpdate(“DELETE FROM usuarios WHERE nome = joao OR 1 = 1”);

Acontece que 1 é igual a 1 em todos os registros! Mas como já dito, isso é evitado pelo uso de aspas simples (justamente o problema que você estava tendo).

Bom, quanto ao uso de PreparedStatement, veja o seu caso, só que usando PreparedStatement:

// ........ o resto igual aqui
con = DriverManager.getConnection(url,usuario,senha);  
// daqui pra cima não muda

PreparedStatement st = con.createStatement("DELETE FROM Equipamentos WHERE Serie = ?");  // cria o PreparedStatement
st.setString(1, valorSelecionado); // muda o valor da interrogação para o valor correto da consulta
st.executeUpdate(); 

// daqui pra baixo também não muda
// .......... o resto igual aqui
K

marcobiscaro2112

Pow cara, valeu pela dica. Vou usar ela. Eu não sabia desse detallhe. Vou procurar mais a respeito disso.

Obrigado mesmo!!

Criado 17 de fevereiro de 2009
Ultima resposta 18 de fev. de 2009
Respostas 5
Participantes 3