Estou começando a estudar sobre interfaces e estou com uma dúvida bastante boba, mas é o seguinte, tenho o botão de cadastrar uma nova categoria, ele está funcionando como se espera, mas caso ocorra algum problema no SQL ele mostra a mensagem, mas também mostra a mensagem que foi inserida com sucesso, mas se ocorreu erro de SQL não deveria aparecer a mensagem se ocorreu erro no SQL.
private void btnCadastrarActionPerformed(java.awt.event.ActionEvent evt) {
String NOME_CATEGORIA = txtNomeCat.getText().toUpperCase();
if (txtNomeCat.getText().trim().isEmpty()) {
JOptionPane.showMessageDialog(null, "O campo não pode ser nulo, favor verificar.");
} else {
String query = "INSERT INTO sistema_financas.tbl_categoria (SK_CATEGORIA, NOME_CATEGORIA,DATA_CADASTRO) VALUES (nextval('sistema_financas.seq_tbl_categoria'), '" + NOME_CATEGORIA + "', current_date)";
try {
Statement stmt = conexao.createStatement();
stmt.executeUpdate(query);
} catch (SQLException e) {
JOptionPane.showMessageDialog(null, e);
}
JOptionPane.showMessageDialog(null, "Categoria Cadastrada!");
txtNomeCat.setText("");
}
}
Você deve ter uma garantia de que a operação de inserção ocorreu com sucesso para só então mostrar a mensagem. Você deve criar uma estrutura de seleção para avaliar se a operação de inserção foi exitosa, para só então exibir a mensagem. Porém você colocou o JOptionPane depois do catch, quando certo seria dentro do try. Eu faria assim:
}else{Stringquery="INSERT INTO sistema_financas.tbl_categoria (SK_CATEGORIA, NOME_CATEGORIA,DATA_CADASTRO) VALUES (nextval('sistema_financas.seq_tbl_categoria'), '"+NOME_CATEGORIA+"', current_date)";try{Statementstmt=conexao.createStatement();stmt.executeUpdate(query);JOptionPane.showMessageDialog(null,"Categoria Cadastrada!");txtNomeCat.setText("");}catch(SQLExceptione){JOptionPane.showMessageDialog(null,e);}
[Dica]: eu particularmente não gosto de exibir informações corriqueiras em diálogos porque obriga o usuário a ficar fechando a janela de diálogo ou clicando em o Ok. Assim, no seu exemplo, em toda inserção o usuários tem que clicar em Ok. Eu, por meu turno gosto de exibir essas informações em um label no rodapé da janela, reservando a eventos de alerta o uso de diálogos.
SamuelLira991 like
Bom dia. o método executeUpdate(query); retorna um int com a quantidade de rows afetadas na tabela:
o método da classe Statement é assim: int executeUpdate(String sql)
você deve verificar se este número é maior que 0 (pelo menos 1 row afetada).
crie uma variavel do tipo int com com escopo global e valor 0;
…
…
resto do código até a execução da query
…
… try{
…
…
affectedRows=stmt.executeUpdate(query);//emvezdesimplesmenteexecutaraquery,armazenaraquantidadederowsafetadasnavariávelcriadaanteriormentecomocontadorif(affectedRows>0){//Sealgumarowfoiafetadanobancodedados:JOptionPane.showMessageDialog(null,"Categoria Cadastrada!");txtNomeCat.setText("");}else{//Senenhumarowfoiafetada:JOptionPane.showMessageDialog(null,"Ocorreu um erro ao cdastrar a categoria!");txtNomeCat.setText("");}affectedRows=0;//resetarovalorparaquenãosejaincrementadocadavezqueexecutar}catch(ClassNotFoundExceptionex){//Exceptionlançadapor"Class.forName(...)"...}catch(SQLExceptionex){...}
Porem uma sugestão para lidar melhor com variáveis nas queries é usar a classe PreparedStatement em vez de Statement e adicionar as variáveis com os métodos para cada tipo de dado (é parecido com o Statement, pesquise sobre caso não conheça)
M
mathdeoliveira
Pessoal, muito obrigado pelas suas respostas.
Eu entendi que estava informado o usuário não no momento correto, mas sim após todos os eventos, não importando o que ocorreu.]
@Jothar_Aleksander
Obrigado pela explicação e pela dica, irei aplicar elas em algumas situações. @SamuelLira99
Obrigado pela outra forma de codificar, não tinha pensando. Vou dar uma olhada melhor nesses métodos que eu uso nas queries.