Newsgroup: it.comp.java
Titolo: Test se un ResultSet è vuoto

Salve a tutti,
come si fa a testare se un ResultySet (ottenuto come risultato di una query
di select) è vuoto o meno?
Tenete presente che se il ResultSet è non vuoto, devo ciclare su di
esso....quindi non posso fare una
cosa del tipo if (rs.next()) altrimenti se è pieno mi perdo il primo
record...
String query = "SELECT * from TABLE";
rs = pstmt.executeQuery();
// qui non posso fare if (rs.next()) altrimenti perdo il primo record...
while (rs.next()) {
    rs.getInt...
    rs.getString...
}
grazie

 di select) è vuoto o meno?
if(rs.isBeforeFirst() && rs.isAfterLast())
	System.out.println("Ell'è voto!!");

 record...
Quello che hai sritto te, e cioe'
  while(rs.next()) { ... }
fa' proprio quel che vuoi: "Cicla" sul resultset se ha almeno un elemento.
Se poi alla fine del ciclo vuoi sapere se il resultset era vuoto o meno
setta un boolean nel ciclo while.
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !

 setta un boolean nel ciclo while.
Si in effetti era il trucchetto a cui avevo pensato (che tra l'altro non mi
piace), ma mi sarei aspettato
un metodo del tipo rs.isEmpty() che mi dicesse se il rs fosse vuoto
o meno...ma forse pretendevo troppo da JDBC...
ciao

Vincent Vega wrote:

Per default il recordset è impostato su BeforeFirst().
E comunque questo test non verifica se il recordset è vuoto.
Per fare il controllo se un recordset è vuoto:
aprire il recordset in modalità scrolling;
rstTemp.last();
if (rstTemp.getRow() == 0)
    out.println(recordset buoto!");

    out.println(recordset buoto!");
Io ho proposto un test che non muove il cursore del resultset. Il tuo 
metodo sposta il cursore, quindi tanto vale usare next() della prima 
fetch magari cambiando leggermente il flusso.
boolean hasNext;
...
rs = stm.executeQuery();
hasNext = rs.next();
if(!hasNext) {
//E' vuoto. Mettere quì la gestione.
}
while(hasNext) {
//Fare quì la fetch dei dati.
[...]
hasNext = rs.next();
};

 ciao
A tutto c'e' una spiegazione.
Il result set tradizionelae risale al jdbc 1.0 jdk 1.0
ed e' un ottimo resultset ancora il + usato.
Il suo principio e' semplicissimo.
Ti do un cursore sequenziale che ti permette di scorrere il Set una volta
sola.
Per vedere se c'e' almeno un record dovrebbe leggere il primo e poi
reinizializzarsi perche se no tu lo avresti perso, o fare delle porcherie
Il principio e' quello di un resultset per un linguaggio orientato alla rete
dove il driver
e' la minimizzazione del quantitaivo di dati trasmessi
Hanno preferito lasciarlo cosi' e te la vedi tu.
con la .5 hanno introdotto nuovi resultset con + funzionalita' , per
adeguarlo ai linguaggi MS che hanno una gioungla di result set potenti ma
molto pesanti e pericolosissimi su applicazioni distribuite
ciao Nicola
 
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 Leggi bene: rs.isBeforeFirst() && rs.isAfterLast()
Pardon. Il test va fatto al contrario.

 fetch magari cambiando leggermente il flusso.
Il metodo proposto da me serve per sapere se e quanti record ci sono in 
archivio a prescindere dal ciclo col next().
Ho già dato la risposta a chi ha postato il messaggio, che non viene 
perso un record se usa while con next() per lo stesso
motivo su descritto. :-)

Vincent Vega wrote:

Ho capito cosa intendi dire... ;-)

 precedente il primo record (ovvero BeforeFirst)*
Appunto. Se leggi la documentazione, quando un resultset non contiene 
righe, isBeforeFirst() ritorna false (dicevo appunto che avevo invertito 
il test). Ovvero un rs vuoto non si posiziona BeforeFirst.

Vincent Vega wrote:

Ah ok...bene!

 ha scritto nel messaggio
news:39qbukF...@individual.net...

Mi spiego meglio:
Io vorrei fare il test, eppoi scorre il rs con il while:
step1:  if (rs.next() == null) => rs VUOTO ed esci
step2:  while (rs.next()) {    ... elabora rs ..  }
se il rs non è vuoto, allo step 1 mi porto da BeforeFirst su First...
e quando faccio rs.next() nel while mi perdo il primo record.....
giusto?
l'unico modo è mettere un boolean
ciao


Potresti rovesciare il test...č usare do...while (rs.next())

 step2:  while (rs.next()) {    ... elabora rs ..  }
boolean test = rs.next();
if(!test) {
//rs vuoto. Gestire.
}
while(test) {
  //Fai quello che devi fare su rs
  [...]
  test = rs.next();
}