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.
[code]
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("");
}
} [/code]
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{
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);
JOptionPane.showMessageDialog(null, "Categoria Cadastrada!");
txtNomeCat.setText("");
}catch (SQLException e) {
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.
1 curtida
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;
poderia ser algo como:
public class NomeDaClasse {
int affectedRows = 0; //esta variável será o contador de rows afetadas
…
…
resto do código até a execução da query
…
…
try{
…
…
affectedRows = stmt.executeUpdate(query); // em vez de simplesmente executar a query, armazenar a quantidade de rows afetadas na variável criada anteriormente como contador
if(affectedRows > 0) { // Se alguma row foi afetada no banco de dados:
JOptionPane.showMessageDialog(null, "Categoria Cadastrada!");
txtNomeCat.setText("");
} else { // Se nenhuma row foi afetada:
JOptionPane.showMessageDialog(null, "Ocorreu um erro ao cdastrar a categoria!");
txtNomeCat.setText("");
}
affectedRows = 0; // resetar o valor para que não seja incrementado cada vez que executar
} catch(ClassNotFoundException ex) { // Exception lançada por "Class.forName(...)"
...
} catch(SQLException ex) {
...
}
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)
1 curtida
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.