Deletar usando PreparedStatement

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:

[code]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();
            }
        }
    }

}                                         

[/code]

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

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.

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”?

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

[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

txnome é um dos JTextFields

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:

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

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.

Oi pessoal… Consegui resolver meu problema e até incrementei de deletar por nome e sobrenome, como podem ver no código abaixo:

[code]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();
            }
        }
    }

}   [/code]

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 é //http://www.guj.com.br/posts/list/0/227726.java#1166902?

Obrigado e muito sucesso a todos!

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