Ajuda JButton apaga registro mas retorna em exec que não

9 respostas
G

Olá pessoal.
Estou fazendo um aplicativo e estou com uma dúvida. Um Botão que fiz ao apagar o registro retorna que a execuçao não foi executada com sucesso, mas quando olho no banco de dados foi apagado. O que estou fazendo errado?

Segue abaixo o código fonte referente ao botão.

private void jbSalvarActionPerformed(java.awt.event.ActionEvent evt) {
        // TODO add your handling code here:
        Object Evento = evt.getSource();
        if (Evento == jbSalvar) {
            try {
                ResultSet consulta;
                Conexao conexao = new Conexao();
                //consulta = conexao.preencheDataSet("Select nome, senha from usuario", 1);
                String nome_fabricante = jtfFabricante.getText().trim();
                String str_fabricante;
                int id_fabricante = 0;
                if (nome_fabricante.length() == 0) {
                    JOptionPane.showMessageDialog(null, "Digite o nome do " +
                            "fabricante!");
                } else {
                    
                    consulta = conexao.preencheDataSet
                            ("select count(id_fabricante)from fabricante", 1);
                    try {
                        while (consulta.next()) {
                            str_fabricante = consulta.getString(1);
                            id_fabricante = Integer.parseInt(str_fabricante);
                        }
                    } catch (Exception err) {
                        err.printStackTrace();
                    }
                    id_fabricante = id_fabricante++;
                    consulta = conexao.preencheDataSet
                            ("insert into fabricante (id_fabricante, nome_fabricante) " +
                            "values ('" + id_fabricante  + "', '" + nome_fabricante + "')", 2);
                    JOptionPane.showMessageDialog
                            (null, "Registro gravado com sucesso!");
                    jtfFabricante.setText("");
                }
            } catch (Exception sqlerr) {
                JOptionPane.showMessageDialog(null, sqlerr);
            }
        }
    }

[size=“11”][color=“red”]* Editado: Lembre-se de utilizar BBCode em seus códigos - Carneiro[/color][/size] :joia:

9 Respostas

M

Se vc está excluindo um registro, porque no seu código aparece a instrução insert? Esse método não é um método para cadastrar?

Dá uma olhada nesse código que usei num trabalho:
public void altera(String nome, String rg, String telefone, Connection conn) {
        String SQL = "UPDATE aluno SET alunome=?,alutelefone=?,                                    + " WHERE alurg=" + "'"+rg+"'";
        try{
             // prepara a Base de Dados para a alteração dos dados 
             PreparedStatement ps = (PreparedStatement) conn.prepareStatement(SQL);
             
             // altera os dados na Base de Dados 
             ps.setString(1,nome);
             ps.setString(2,telefone);
             
             // atualiza a base
             ps.executeUpdate();
             
             // fecha a  conexão
              ps.close();                    
            }catch(SQLException ex) {
            ex.printStackTrace();           
        }
   }

Espero que ajude

G

Opa. Erro de Ctrl C Ctrl V.
Segue o código que tá dando problema:

[i]  private void jbApagarActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

Object Evento = evt.getSource();

if (Evento == jbApagar) {

ResultSet consulta;

String nome_genero = jtfFabricante.getText().trim();

Conexao conexao = new Conexao();

try {

consulta = conexao.preencheDataSet("DELETE FROM genero " +

WHERE nome_genero LIKE (’” + nome_genero + “’), 1);

if (consulta != null) {

JOptionPane.showMessageDialog(null, Registro excluido com sucesso!);

} else if (consulta == null) {

JOptionPane.showMessageDialog(null, Não existe registro, Erro, 0);

}
} catch (Exception err) {
            JOptionPane.showMessageDialog(null, err);
        }
    }
}[/i][/i]
M

Esse nome_genero LIKE(…),1. Pra que esse 1? Outra coisa, usando o LIKE, é melhor usar onde vc queira excluir vários registros com um mesmo caracter, nesse caso eu não recomendo vc usar o LIKE. Porque vc não faz:

consulta = ...("DELETE FROM genero WHERE nome_genero = '" + nome_genero + "'");

Não se esqueça que em SQL também existem as aspas simples ( ’ ) ao lado dos dados, exemplo: 'aspa'

Outra, vc faz comparação do atributo consulta igual a null, vc tem certeza que quando o dado é excluído ele retorna null?

G
Eu possuo uma classe Conexao, e quando no final da sql existe o 1 é somente para comando select,  quando uso o 2 é para update, delete ou insert. Mas não é somente para indicação. A classe tem alguns processos quando é ativado o número 1 ou 2.

Sobre a questão do like ou where, concordo que poderia utilizar o where, mas no caso do where o nome é identico.  o like permite, juntamente com a regra de sql delete, remover todos os nomes que por ex. começam com a Letra A, ou por ex, tudo que tenha início como Cor (bom, isto você  sabe).

Mas estou querendo utilizar o like. E eu sei que o comando sql está sendo executado. Não estou é entendendo onde meus códigos estão errados,  que consigo excluir, mas o:

} catch (Exception err) {

JOptionPane.showMessageDialog(null, err);

} 

Retorna erro.

Isto que não estou entendendo.

Por ex, quando você disse:

Outra, vc faz comparação do atributo consulta igual a null, vc tem certeza que quando o dado é excluído ele retorna null?

Eu acredito que é  que está o erro, mas quando a consulta é igual a null teria que sair um erro, que foi o que programei nesta parte:

 else if (consulta == null) {

JOptionPane.showMessageDialog(null, Não existe registro, Erro, 0);

}

Mas quando a consulta é != de null, ele ainda informa este erro.
Ta bem doido isso.

H

Olá amigo,

Bom não sei se essa é a solução, mas em todos os códigos de banco que eu fiz quando era necessário deletar algum campo eu não usava ResultSet…

Primeiro, Delete é uma operação de Update no Banco de dados…O resultSet serve basicamente para retornar valores de consultas.
Acredito que o erro esteja justamente por causa dele e pelas verificações de If e Else que você faz.
Uma operação de Delete, ou dá certo ou dá errado e você deveria usar um tipo SQLException pra saber se qual o tipo de erro se o erro foi realmente na Base de Dados, mas você está usando um Exception geral e não colocou o erro que dá pra gente ver… A mensagem de erro que aparece no caso é o da sua cláusula if e else.

Ah, uma outra coisa, eu não reparei direito, mas feche as conexões e os resultset depois que você usar com o método Close().

Faça assim, não retorne nada, use um Try Catch no método onde faz o delete. Se cair no catch ocorreu erro, se passar pelo Try, delete efetuado com sucesso. Segue alteração no trecho do seu código:

try { conexao.preencheDataSet("DELETE FROM genero " + "WHERE nome_genero LIKE ('" + nome_genero + "')", 1); JOptionPane.showMessageDialog(null, "Registro excluido com sucesso!"); } catch (Exception err) { JOptionPane.showMessageDialog(null, "Não existe registro ou erro:"+ err.getMessage() ); }

Espero ter ajudado…Ah, e avise se deu certo!! :slight_smile:

G

Bom, agora eu deixei conforme as orientações anteriores:

private void jbApagarActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
        Object Evento = evt.getSource();
        ResultSet consulta;
        String nome_genero = jtfGenero.getText().trim();
        if (Evento == jbApagar) {
            if (nome_genero.length() == 0)
                JOptionPane.showMessageDialog
                     (null, "Digite o nome do registro a apagar!", "Erro", 0);
            else{
                Conexao conexao = new Conexao();
                try {
                    consulta = conexao.preencheDataSet
                         ("DELETE FROM genero " +
                         "WHERE nome_genero LIKE ('" + nome_genero + "')", 2);
                    JOptionPane.showMessageDialog
                         (null, "Registro excluido com sucesso!");
                    consulta.close();
                } catch (SQLException err) {
                    JOptionPane.showMessageDialog
                         (null, "Não existe registro" + err.getMessage(),
                         "Erro", 0);
                }
            }
        }
    }

Mas, aí acontece que mesmo que o registro não exista, ele informe que foi excluído com sucesso (Sim, eu vi onde está o erro, mas agora minha dúvida é a seguinte):
Como eu faço para executar um comando sql dando select comparando se existe o registro e através disto, retorne a mensagem? O comando sql e a mensagem eu sei, mas como eu comparo isto, digamos, “no meio”, isto é, como declarar uma variável que irá fazer esta checagem??

Desde já, agradeço pela atenção.

PS: Ah, e foi mal ta perguntando tanto. Sou novo em programação ainda. To muito acostumado em redes linux mas programação ainda sou meio novo. Hehe.
:grin:
Mas fazer o q. Tenho que aprender!!

H

Olá amigo!! Esquenta a cabeça não, todos nós temos problemas e estamos aqui pra ajudar!! Sinta-se à vontade pra tirar suas dúvidas.

Bom, eu fiz um teste aqui e realmente acontece isso, mesmo que não exista ele retorna Sucesso....
Então, depois de ler a documentação e não entender muita coisa eu resolvi testar de novo e cheguei na solução, que vai servir tanto pra você quanto pra mim, se Deus quiser!! :razz:

Quando você executar qualquer operação de update no banco, ou seja, como exemplo:
ConsultaSQL.executeUpdate("Delete from Filmes where Cod="+cod);
Ele retorna um int dizendo se a operação deu ou não certa!! Juro que eu não sabia disso...rsrs faz assim:
int x =ConsultaSQL.executeUpdate("Delete from Filmes where Cod="+cod);
              	if(x==1)
        		System.out.println("Delete efetuado!");
        	else
        		System.out.println("Valor Inexistente");

E do mesmo jeito, se você executa um Select no banco, mas ele não acha nada você deve verificar o ResultSet. Se existir itens no ResultSet, significa que a consulta retornou alguma coisa, se não, não!
Lembrando que de acordo com a documentação, um ResultSet que recebe o resultado de uma executeQuery, nunca vai ter um valor igual a null, em nenhuma hipótese!

Faz assim:
ResultSet Resultados = ConsultaSQL.executeQuery("SELECT Filme FROM Filmes where Cod ="+cod+"");
	
        if(Resultados.next()!=true)
			System.out.println("Não encontrado");
		else
			System.out.println("Encontrado");

Bom, espero que agora eu tenha ajudado direito!! Abraço e avise se agora foi!!! :wink:

G

Hericksnake, deu certo sim, eu tive que mudar algumas coisas na minha classe.

Antes, eu estava usando uma classe conexao que passava por parâmetro o sql e uma opção int, se fosse 1 seria apenas um executeQuery, se fosse 2 seria um executeUpdate, mas esta classe não permitia retornar estes valores int x por ex…

Então fiz tudo na classe mesmo. E tá funcionando legal.
Vlw mesmo cara, e agradeço a todos que me ajudaram também.

Vlw !!! :grin:

G

Agora o próximo passo é eu fazer a tela de cadastro onde pega todos os campos, genero, fabricante, plataforma. Vivendo e aprendendo. hehe

Criado 26 de janeiro de 2008
Ultima resposta 30 de jan. de 2008
Respostas 9
Participantes 3