Deletar usando PreparedStatement

10 respostas
adriano_kahn

Olá pessoal. Estou tendo um problema com um cadastro, pois a inserção está funcionando show de bola, já a exclusão nem dá erro e nem exclui

O código de inserção é o seguinte:
private void btCadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:

        //Inserindo dados digitados no JTextField para que seja usado
        //no comando SQL
        nome = txNome.getText();
        sobrenome = txSobrenome.getText();

        //O campo código por ser autoincrementado no SQL, não entra nessa
        //instrução pois ele é gerado pelo próprio banco, no caso MySQL
        String strSQL = "INSERT INTO Autor (nome, sobrenome)"+
                        "VALUES (?, ?)";

        //Cria um objeto conexão para poder comunicar com a classe Conexao
        Conexao c = new Conexao();

        //Cria um objeto Coonection ligado a classe Conexão
        //e buscando a váriavel do tipo Connection da classe conexão
        Connection conn = c.getConexao();

        try
        {
            //Passa o comando SQL para a consulta no Banco de Dados
            PreparedStatement stmt = conn.prepareStatement(strSQL);

            //Altera os dados digitados nos TexFields no Banco de dados
            //"1" é o indice do campo e "nome" é o nome do campo na tabela
            stmt.setString(1, nome);
            stmt.setString(2, sobrenome);

            stmt.executeUpdate();
            stmt.close();
            conn.close();

            //Se o procedimento for efetuado com sucesso, exibe:
            JOptionPane.showMessageDialog(rootPane, "Registro Efetuado com sucesso");
        }

        catch (SQLException sqlex)
        {
            sqlex.getMessage();
        }

        /*
        try
        {
            c.fecharConexao();
        }

        catch (Exception e)
        {
            throw new java.lang.RuntimeException("Erro Fechar");
        }*/
    }
O código de exclusão:
private void btRemoverActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:

        //Verifica se não foi digitado nada
        if ((txNome.getText().length() == 0) && (txSobrenome.getText().length() ==0))
        {
            JOptionPane.showMessageDialog(rootPane, "Digite o nome autor");
        } //fim do if

        else
        {
            //ShowConfirmDialog retorna inteiro dependendo da opção escolhida
            int resp = JOptionPane.showConfirmDialog(rootPane, "Tem certeza"+
                                "que deseja excuir esse registro?");

            if (resp == 0)
            {
                //instrução SQL
                String strSQL = "DELETE FROM Autor"+
                         "WHERE nome =" +txNome.getText();

                Conexao c = new Conexao();
                Connection conn = c.getConexao();

                try
                {
                    PreparedStatement stmt = conn.prepareStatement(strSQL);
                    stmt.setString(1, nome);
                    
                    stmt.executeUpdate(strSQL);

                    stmt.close();
                    conn.close();
                }

                catch (SQLException e)
                {
                    e.getMessage();
                }
            }
        }

    }

Espero que possam me ajudar, pois já estou batendo cabeça... rsrsrs. Abraço e muito sucesso a todos

10 Respostas

zerokelvin

se simplesmente não exclui o registro e também não aparece stack, manda imprimir o preparedsttement antes de executar
System.out.println(stmt.toString());
dae pega o q imprimir e executa direto no banco… veja o que acontece.

Se estiver imprimindo um stacktrace, cola ae pra gente ver.

W

Não testei o código mais pelo que entendi,

Ele só ira gravar se mostrar o JOptionPane

if (resp == 0)

Aqui

String strSQL = "DELETE FROM Autor"+ "WHERE nome =" +txNome.getText();

mude para

// coloquei espaço apos o "Autor" e apos "nome =", pq ao concatenar a String ficaria "DELETE FROM AutorWHERE nome =NOMEAUTOR" String strSQL = "DELETE FROM Autor "+ "WHERE nome = " +txNome.getText();

Aqui você pega o int da resposta

int resp = JOptionPane.showConfirmDialog(rootPane, "Tem certeza"+ "que deseja excuir esse registro?");

Mas aonde você pega o “txNome”?

A

Está estranho seu código de exclusão.

O seu SQL está assim

String strSQL = "DELETE FROM Autor"+ "WHERE nome =" +txNome.getText(); Porem em momento algum vc definiu o parametro “?” e sim está pegando do proprio componente.

Tente alterar o seu SQL para isto String strSQL = "DELETE FROM Autor "+ " WHERE nome = ?"; Assim faz sentido vc passar o parametro

stmt.setString(1, nome);

Att

Metaleiro

[color=darkblue] Dê uma olhada nesses dois exemplos e tente postar o erro que está ocorrendo :[/color]

Delete Records Using PreparedStatement

Deleting Records using the Prepared Statement

adriano_kahn

txnome é um dos JTextFields

Giovani_Fiori

cara da uma olhada na apostila FJ-21 da Caelum,

do capitulo 2 ao capitulo 5 ela explica sobre jdbc e faz operações de inserção e exclusão usando prepared statement.

material mto bom.

segue link:

adriano_kahn

Estou tentando de tudo, más ainda não consegui

W

Pelo que vi em seu codigo

ele só deleta quando cair no “ELSE” e para cair no “ELSE” o campor “txtNOME” tem que estar vazio

e se ele estiver vazio não tem como pegar o texto dele ao montar o “Delete”.

Espero que isto lhe ajude.

adriano_kahn
Oi pessoal... Consegui resolver meu problema e até incrementei de deletar por nome e sobrenome, como podem ver no código abaixo:
private void btCadastrarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:

        //Inserindo dados digitados no JTextField para que seja usado
        //no comando SQL
        nome = txNome.getText();
        sobrenome = txSobrenome.getText();

        //O campo código por ser autoincrementado no SQL, não entra nessa
        //instrução pois ele é gerado pelo próprio banco, no caso MySQL
        String strSQL = "INSERT INTO Autor (nome, sobrenome)"+
                        "VALUES (?, ?)";

        //Cria um objeto conexão para poder comunicar com a classe Conexao
        Conexao c = new Conexao();

        //Cria um objeto Coonection ligado a classe Conexão
        //e buscando a váriavel do tipo Connection da classe conexão
        Connection conn = c.getConexao();

        try
        {
            //Passa o comando SQL para a consulta no Banco de Dados
            PreparedStatement stmt = conn.prepareStatement(strSQL);

            //Altera os dados digitados nos TexFields no Banco de dados
            //"1" é o indice do campo e "nome" é o nome do campo na tabela
            stmt.setString(1, nome);
            stmt.setString(2, sobrenome);

            stmt.execute(); //Porque para cadastrar tenho que usar executeUpdate() e para deletar lá em baixo uso execute()?
            stmt.close();
            conn.close();

            //Se o procedimento for efetuado com sucesso, exibe:
            JOptionPane.showMessageDialog(rootPane, "Registro Efetuado com sucesso");
        }

        catch (SQLException sqlex)
        {
            sqlex.getMessage();
        }

        /*
        try
        {
            c.fecharConexao();
        }

        catch (Exception e)
        {
            throw new java.lang.RuntimeException("Erro Fechar");
        }*/
    }                                           

    private void btRemoverActionPerformed(java.awt.event.ActionEvent evt) {                                          
        // TODO add your handling code here:

        //Verifica se não foi digitado nada
        if ((txNome.getText().length() == 0) && (txSobrenome.getText().length() ==0))
        {
            JOptionPane.showMessageDialog(rootPane, "Digite o nome e sobrenome autor");
        } //fim do if

        else
        {
            //ShowConfirmDialog retorna inteiro dependendo da opção escolhida
            int resp = JOptionPane.showConfirmDialog(rootPane, "Tem certeza"+
                                "que deseja excuir esse registro?");

            if (resp == 0)
            {
                //instrução SQL
                //String strSQL = "DELETE FROM Autor "+
                //         "WHERE nome = ?";

                Conexao c = new Conexao();
                Connection conn = c.getConexao();

                nome = txNome.getText();
                sobrenome = txSobrenome.getText();
                
                String strSQL = "DELETE FROM Autor where nome = ? "+
                                "AND sobrenome = ?";

                try
                {
                    PreparedStatement stmt = conn.prepareStatement(strSQL);
                    stmt.setString(1, nome);
                    stmt.setString(2, sobrenome);
                    
                    System.out.println(stmt.toString());
                    
                    stmt.execute(); //Porque para deletar tenho que usar execute() e para cadastrar lá em cima uso executeUpdate()?

                    stmt.close();
                    conn.close();
                }

                catch (SQLException e)
                {
                    e.getMessage();
                }
            }
        }

    }
Deu tudo certinho. Más agora surgiu uma nova dúvida... Porque para Cadastrar usei executeUpdate() e para remover usei execute()... Abri um post novo aonde essa pergunta pode ser respondida para ajudar o pessoal da comunidade quando procurar por essa dúvida específica. O link do post é [url]//http://www.guj.com.br/posts/list/0/227726.java#1166902?[/url]

Obrigado e muito sucesso a todos!

adriano_kahn

Agora como faço a parte de Update. Tô encontrando dificuldades pois quero inserir o nome a ser atualizado em meu JTextField txnome e logo depois inserir o novo nome… Más não estou conseguindo sucesso…

Obrigado e muito sucesso a todos

Criado 16 de dezembro de 2010
Ultima resposta 16 de dez. de 2010
Respostas 10
Participantes 6