Re:Obrigatoriedade de teste em ResultSet.next()[RESOLVIDO]
18 respostas
T
tiagosarj
Boa noite, hombres e muchachas
Estou com a seguinte dúvida: em um ResultSet retornado por Statement.executeQuery() é necessário percorrer com while() ou testá-lo com if()? Ainda que o result só tenha um registro?
if(ff.equals("2210")||ff.equals("2211")){StatementstmEmpresa=conn.createStatement();ResultSetrsEmpresa=null;rsEmpresa=stmEmpresa.executeQuery("SELECT emp_plano FROM folha.Empresa WHERE fab_matricula='"+matricula+"'");while(rsEmpresa.next()){//ISSO É NECESSÁRIO? por que não simplesmente "rsEmpresa.next()"?if(ff.equals("2210")&&rsEmpresa.getString(1).equals("2")){ff_sap="9533";}elseif(ff.equals("2210")&&rsEmpresa.getString(1).equals("3")){ff_sap="P532";}elseif(ff.equals("2211")&&rsEmpresa.getString(1).equals("2")){ff_sap="9535";}elseif(ff.equals("2211")&&rsEmpresa.getString(1).equals("3")){ff_sap="P534";}valor=rs.getString(7).replace(".","");}rsEmpresa.close();stmEmpresa.close();}else{valor=rs.getString(7).replace(".","");ff_sap=(String)arqv2.get(ff);}
Pergunto isso porque quando tiro o teste ocorre uma exceção. A VM diz que o result está fechado! Como, se o result acabou de ser criado, o fecho no final, e sempre que preciso fazer a consulta, o instancio novamente?!
Se você tem certeza que só vai retornar um registro, então pode usar if (rsEmpresa.next())
lina
Oi,
Eu utilizaria o while. Não vejo nenhum motivo para não usa-lo.
E um outro grande detalhe, fecharia o Statement e o ResultSet dentro de um bloco finally{}.
Só assim você irá garantir de que seu Result é mesmo fechado.
Tchauzin!
T
tiagosarj
Bom dia,
Sim, romarcio, retorna apenas um único registro sempre. Minha dúvida é o porquê que só com teste o result.Next() funciona sem exception.
E por que o result não seria fechado normalmente fora do teste e fora do finally? Devo simplesmente abstrair isso? A primeira vista, não vejo muita lógica(creio que por ignorar como o método next funciona).
Resumindo: minha dúvida é por que não posso fazer simplesmente assim:
rsEmpresa.next();//já que sempre retorna um único registro(...)rsEmpresa.close();stmEmpresa.close();
valew, caras
abraço
rmendes08
Quando o ResultSet é criado o cursor está posicionado antes do primeiro registro do resultado. Se você tem certeza que sempre haverá um registro no resultado, basta chamar next() uma única vez, e você estará posicionado no registro. O problema é esse “sempre”. Você não pode confiar demais no estado do banco de dados para que sua aplicação funcione. Se a consulta não retornar registro algum, mesmo que isso configure uma situação de erro é interessante você tratar essa situação, por isso você deve testar se a chamada a next() posicionou você em um registro de fato.
Para fechar o ResultSet, você não precisa fazer isso dentro do if, mas deve fazer em bloco finally como boa prática, pois se ocorrer uma exceção antes do comando close() do ResultSet e ele estiver fora de um bloco finally, close() não será chamado e o cursor ficará aberto no banco de dados.
T
tiagosarj
certo, rmendes08. Boa explicação. Mas o interessante é que:
Cara, posta o código que dispara a exceção, só assim pra saber o que está errado.
T
tiagosarj
É o mesmo que está aí em cima, mas sem o while().
if(ff.equals("2210")||ff.equals("2211")){StatementstmEmpresa=conn.createStatement();ResultSetrsEmpresa=null;rsEmpresa=stmEmpresa.executeQuery("SELECT emp_plano FROM folha.Empresa WHERE fab_matricula='"+matricula+"'");rsEmpresa.next()// <----- Exceção(ResultSet fechado)if(ff.equals("2210")&&rsEmpresa.getString(1).equals("2")){ff_sap="9533";}elseif(ff.equals("2210")&&rsEmpresa.getString(1).equals("3")){ff_sap="P532";}elseif(ff.equals("2211")&&rsEmpresa.getString(1).equals("2")){ff_sap="9535";}elseif(ff.equals("2211")&&rsEmpresa.getString(1).equals("3")){ff_sap="P534";}valor=rs.getString(7).replace(".","");rsEmpresa.close();stmEmpresa.close();}else{valor=rs.getString(7).replace(".","");ff_sap=(String)arqv2.get(ff);}
grato
rmendes08
Posta o código do jeitinho que você está executando, e coloca também a stack trace, com certeza você está indo pelo caminho errado. Não há como o método saber se ele está sendo chamado em uma linha vazia ou dentro de um comando if, portanto, o seu problema não é esse. A minha suspeita é que a query não retorna resultado, e quando você usa o if, ou o while o código é desviado para um trecho onde não acontece o erro. Posta a stacktrace.
StatementstmEmpresa=conn.createStatement();ResultSetrsEmpresa=null;rsEmpresa=stmFabasa.executeQuery("SELECT emp_plano FROM folha.Empresa WHERE fab_matricula='"+matricula+"'");
Você cro]iou o Statement stmEmpresa mas passou para o resultset o (stmFabasa e não o stmEmpresa) rsEmpresa = stmFabasa.executeQuery.
T
tiagosarj
opa! mais um erro de post. ignora isso tmb. Corrigindo o código…
valeu.
ViniciusLM
tiagosarj:
opa! mais um erro de post. ignora isso tmb. Corrigindo o código…
se caso não retornar algum registro o sistema vai continuar linha por linha e vai dar erro por quando ele tentar rsEmpres.getString(1) nao ter nada para pegar e vai pular para o Exception e tambem é por isso que recomendaram colocar o close no finally pois se ir para o Exception mesmo assim o resultset sera fechado :lol:
A verificação se existe registro é sempre bem vinda
T
tiagosarj
Sim, sim, si. Era só uma dúvida. Não estava entendendo porque o result estava fechado se tinha acabado de ser criado. Sei que, quando não existe nenhum registro a ser retornado, o result estará fechado. Abri o tópico porque no momento que era emitida a exceção, havia registro. Ao menos eu achava que havia :oops: . Tinha um outro teste no código que fazia com que entrasse no trecho em um momento que eu estava ignorando. E sob essas condições, realmente não existia registro algum. Como não coloquei todo o código aqui, e isso não seria pertinente, vocês não puderam enxergar, e em verdade nem poderiam sem o banco.
grato a todos
abraço
ViniciusLM
tiagosarj:
Sim, sim, si. Era só uma dúvida. Não estava entendendo porque o result estava fechado se tinha acabado de ser criado. Sei que, quando não existe nenhum registro a ser retornado, o result estará fechado. Abri o tópico porque no momento que era emitida a exceção, havia registro. Ao menos eu achava que havia :oops: . Tinha um outro teste no código que fazia com que entrasse no trecho em um momento que eu estava ignorando. E sob essas condições, realmente não existia registro algum. Como não coloquei todo o código aqui, e isso não seria pertinente, vocês não puderam enxergar, e em verdade nem poderiam sem o banco.
Ahá! Se em determinadas condições não existe registro isso só mostra que é necessário fazer o teste!
Mesmo que presumidamente sempre havera dados, é uma boa prática sempre provar aquilo que se presume. Eu simplificaria da seguinte maneira:
ResultSetrs=........if(!rs.next()){thrownewAlgumaException("Dados inconsistentes, nao existe o registro tal");}//Aquicontinuaavidanormal.Agorasimégarantidoqueoresultsetestaposicionadonoprimeiroregistrovari=rs.getString("Campo");......
ViniciusLM
gomesrod:
tiagosarj:
E sob essas condições, realmente não existia registro algum
Ahá! Se em determinadas condições não existe registro isso só mostra que é necessário fazer o teste!
Mesmo que presumidamente sempre havera dados, é uma boa prática sempre provar aquilo que se presume. Eu simplificaria da seguinte maneira:
ResultSetrs=........if(!rs.next()){thrownewAlgumaException("Dados inconsistentes, nao existe o registro tal");}//Aquicontinuaavidanormal.Agorasimégarantidoqueoresultsetestaposicionadonoprimeiroregistrovari=rs.getString("Campo");......
Ué... mas se ele nao tiver registro o sistema deve parar por ali...
será que não seria melhor assim...
if(rs.next()){
//aquifazocodigoquejatem}else{
//Senãoouverdadoseleexecutaissointi=JOptionPane.showConfirmDialog(null,"Deseja mesmo visualizar o resultado da busca?");if(i==0){
JOptionPane.showMessageDialog(null,"Hááá pegadinha do malandro, não tem dados não.");}elseif(i==1){
JOptionPane.showMessageDialog(null,"Sorte sua, afinal não foram encontrados dados.");}elseif(i==2){
JOptionPane.showMessageDialog(null,"Se era pra cancelar porque fez a pesquisa eim seu calango branco.");}
}
T
tiagosarj
Ahn han! Dá pra confiar não! testando sempre a partir de agora…
Ahn han! Isso acontece com os erros mais banais, por falta de atenção. Que não nos aconteça quando o tempo for escasso, e quando não, que enxerguemos a tempo!