[RESOLVIDO]tratar consulta vazia MySQL em aplicação java

6 respostas
T

Boa noite a todos,

Gostaria de uma ajuda dos nobres companheiros para resolver um pequeno problema em minha aplicação java, pois não estou conseguindo tratar a exceção de retorno nulo de pesquisa ao banco, possuo uma Jtable onde é populada se existirem registros na consulta ao banco, só não consigo interagir com o usuário se não houverem registros tipo; deixar uma mensagem de que não a registros para aquela consulta. segue código:
Class.forName("com.mysql.jdbc.Driver");

                Connection com;

                com = DriverManager.getConnection("jdbc:mysql://127.0.0.1/java", "root", "root");

                String query = "select * from despesa where MES = ? and ANO = ? order by DIA ";

                PreparedStatement stmt = com.prepareStatement(query);


                stmt.setString(1, consul_mes.getText().trim());
                stmt.setString(2, ano2.getText().trim());

                ResultSet rs;

                rs = stmt.executeQuery();

           ERRO NESTE TRATAMENTO!!!!
//                if (rs.next() == false) {
//
//                    JOptionPane.showMessageDialog(null, "Não existem despesas cadastradas neste período");
//
//                    consul_mes.setText("");
//                    consul_ano.setText("");
//
//                } else {

                    DefaultTableModel modal = (DefaultTableModel) tabela.getModel();

                    tabela.setDefaultRenderer(Object.class, new CellRenderer());

                    modal.setNumRows(0);

                    while (rs.next()) {

                        modal.addRow(new Object[]{rs.getString("id"), rs.getString("Despesa"), rs.getString("Valor"), rs.getString("Dia"), rs.getString("Mes"), rs.getString("Ano"), rs.getString("Parcelado"), rs.getString("Parcelas"), rs.getString("Descricao")});
                    }
                //}
            } catch (ClassNotFoundException ex) {
                JOptionPane.showMessageDialog(null, "Não foi possivel encontrar a Classe");
            } catch (SQLException ex) {

                JOptionPane.showMessageDialog(null, "Ocorreu um erro de SQL." + ex.getMessage());
            }

6 Respostas

charleston10

cara, vc fez ao contrario…

é assim…

if (rs.next() == true) { //tem registro } else { JOptionPane.showMessageDialog(null, "Não existem despesas cadastradas neste período"); }

ou
'-> O retorno do RS.NEXT é true…

if (rs.next()) { //tem registro } else { JOptionPane.showMessageDialog(null, "Não existem despesas cadastradas neste período"); }

T

charleston10:
cara, vc fez ao contrario…

é assim…

if (rs.next() == true) { //tem registro } else { JOptionPane.showMessageDialog(null, "Não existem despesas cadastradas neste período"); }

ou
'-> O retorno do RS.NEXT é true…

if (rs.next()) { //tem registro } else { JOptionPane.showMessageDialog(null, "Não existem despesas cadastradas neste período"); }

Da maneira que codifiquei está meio certa, pois quando não existem registros a mensagem de erro aparece, mas quando existem sempre fica faltando algum na tabela populada. Mas quando eu gero um relatório ele aparece e até mesmo contabiliza o valor certo mesmo não aparecendo o registro no aplicativo. Utilizei a sua sugestão e o mesmo acontece.

A

“meio certa” … Acontece pelo seguinte: quando você dá um rs.next(), ele não apenas retorna true (quando há registro) ou false(quando não há). Ele se posiciona no próximo registro. Por isso que você “perde um” quando está testando a condição. O que você pode fazer: vá por essa de usar o while(rs.next()) para obter quantos registros existirem e ir populando o seu DefaultTableModel. Ao terminar, fora do while, você checa quantas linhas tem o DefaultTableModel, chamando modal.getRowCount(). Se ele retornar 0 é porque não houve registros na consulta e então você mostra a mensagem que quer para o usuário.

Fora isso… estude alternativa ao DefaultTableModel… o pessoal por aí condena o uso dele por vários motivos.

T

ADEMILTON:
“meio certa” … Acontece pelo seguinte: quando você dá um rs.next(), ele não apenas retorna true (quando há registro) ou false(quando não há). Ele se posiciona no próximo registro. Por isso que você “perde um” quando está testando a condição. O que você pode fazer: vá por essa de usar o while(rs.next()) para obter quantos registros existirem e ir populando o seu DefaultTableModel. Ao terminar, fora do while, você checa quantas linhas tem o DefaultTableModel, chamando modal.getRowCount(). Se ele retornar 0 é porque não houve registros na consulta e então você mostra a mensagem que quer para o usuário.

Fora isso… estude alternativa ao DefaultTableModel… o pessoal por aí condena o uso dele por vários motivos.

Vlw pelas dicas Ademilton, mas na verdade sou da área de infraestrutura, mas sempre tive vontade de fazer uma aplicação com os poucos conhecimentos que tenho, mas pelo o que estou vendo preciso estudar mais.

charleston10

ADEMILTON:
“meio certa” … Acontece pelo seguinte: quando você dá um rs.next(), ele não apenas retorna true (quando há registro) ou false(quando não há). Ele se posiciona no próximo registro. Por isso que você “perde um” quando está testando a condição. O que você pode fazer: vá por essa de usar o while(rs.next()) para obter quantos registros existirem e ir populando o seu DefaultTableModel. Ao terminar, fora do while, você checa quantas linhas tem o DefaultTableModel, chamando modal.getRowCount(). Se ele retornar 0 é porque não houve registros na consulta e então você mostra a mensagem que quer para o usuário.

Fora isso… estude alternativa ao DefaultTableModel… o pessoal por aí condena o uso dele por vários motivos.

Concordo toltalmente… e outra…

meio certa" …

Não existe meio certo, ou você tem certeza do que está fazendo ou vc vai ter dúvidas…

A

Perseverança e nunca duvidar que pode fazer melhor. Com isso na cabeça o sucesso é inevitável.

Criado 10 de janeiro de 2013
Ultima resposta 11 de jan. de 2013
Respostas 6
Participantes 3