Primeiro resultado de busca sql não aparece na tabela
10 respostasResolvido
sqljava
R
rcarvalhoalencar
Olá, Devs.
Me apareceu um probelma um tanto quanto inusitado. Estava montando a tela do meu programa com uma tabela, criei ela normal que nem criei as outras, e quando executei o SQL para exibir o resultado na tabela percebi que ela sempre oculta o primeiro resultado.
EX do Do Banco:
Eu também “sofro” com este problema, pra resolver eu adiciono o item duas vezes:
publicList<Recado>listAll(){conecta.conexao();List<Recado>lista=newArrayList<>();try{conecta.executaSQL("SELECT * FROM recado WHERE status = 'Não Entregue' ORDER BY importancia DESC");conecta.rs.first();Recadomod=newRecado();mod.setId(conecta.rs.getInt("id"));mod.setPorteiro(conecta.rs.getString("porteiro"));mod.setMensagem(conecta.rs.getString("mensagem"));mod.setImportancia(conecta.rs.getString("importancia"));mod.setStatus(conecta.rs.getString("status"));lista.add(mod);if(conecta.rs.next()){do{Recadomod2=newRecado();mod2.setId(conecta.rs.getInt("id"));mod2.setPorteiro(conecta.rs.getString("porteiro"));mod2.setMensagem(conecta.rs.getString("mensagem"));mod2.setImportancia(conecta.rs.getString("importancia"));mod2.setStatus(conecta.rs.getString("status"));lista.add(mod2);}while(conecta.rs.next());}else{System.out.println("Tabela Vazia");}}catch(SQLExceptionex){ex.printStackTrace();}finally{conecta.desconecta();}returnlista;}
Poxa kkkk Adicionar o item 2 vezes é fora de cogitação por que para controlar as quantidades depois iria ficar complicado pro cliente.
R
rcarvalhoalencar
select nome, quantidade from tab_subitem where idprod=5;
Se eu usar esse código no workbench ou sql editor da o retorno correto, mas no java não.
R
rcarvalhoalencar
Nem trocando por first() dá certo.
// NO Workbench
// Na aplicação
privatevoidbuscarsubitem(){try{Stringsql="select nome, quantidade from tab_subitem where idprod=?";pst=conexao.prepareStatement(sql);pst.setString(1,cId.getText());rs=pst.executeQuery();if(rs.next()){tSubItens.setModel(DbUtils.resultSetToTableModel(rs));}else{JOptionPane.showMessageDialog(null,"Erro(#tbo01): Sub-Item não encontrado.");}}catch(HeadlessException|SQLExceptione){JOptionPane.showMessageDialog(null,"Erro(#tbo02): "+e);}}
R
Solucao aceita
rcarvalhoalencar
Descobri o problema!
Eu estava colocando o método de povoar a tabela dentro do IF:
if(rs.next()){
tSubItens.setModel(DbUtils.resultSetToTableModel(rs));}else{
JOptionPane.showMessageDialog(null,"Erro(#tbo01): Sub-Item não encontrado.");}
O rs.next() do if fazia com que o rs pulasse para a linha 2. Ao usar esse tipo de método se coloca sem o if. no Caso o certo é:
privatevoidbuscarsubitem(){try{Stringsql="select nome, quantidade from tab_subitem where idprod=?";pst=conexao.prepareStatement(sql);pst.setString(1,cId.getText());rs=pst.executeQuery();tSubItens.setModel(DbUtils.resultSetToTableModel(rs));}catch(HeadlessException|SQLExceptione){JOptionPane.showMessageDialog(null,"Erro(#tbo02): "+e);}}
R
rodriguesabner
Na realidade não, o if vai checar se o resultado existe mesmo. A ausência dele vai te causar um SQLException, que quando a tabela estiver vazia, no seu caso, vai gerar uma mensagem
R
rcarvalhoalencar
Ah.
Bom, pelo menos sem o if funciona, mesmo sendo gambiarra no código. Melhor tratar com o Exception, quando houver, do que continuar com o erro.