Newsgroup: it.comp.java
Titolo: ResultSet a cascata in JSP

Ciao a tutti,
sto sviluppando una semplice web app in JSP, che deve effettuare le
seguenti operazioni:
1) effettuare una query sql SELECT per estrarre una lista di articoli
dalla tabella_base (che è la join di alcune tabelle)
2) per ogni articolo restituito dalla tabella_base effettuare una
query SELECT sulla tabella_speciale (che è la join di alcune tabelle
uguali a quelle di tabella_base), se la query fornisce 1 risultato
allora bisogna utilizzare i suoi dati, altrimenti utilizzare i dati
della tabella_base.
Ho utilizzato il seguente codice:
Connection conn = null;
ResultSet rs = null, rs2 = null;
Statement stmt = null, stmt2 = null;
String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
Class.forName(DRIVER);
conn=DriverManager.getConnection("jdbc:odbc:miodb;...........);
stmt=conn.createStatement();
stmt2=conn.createStatement();
str="SELECT * from tabella_base"
rs = stmt.executeQuery(str);
while (rs.next())
{
   cod = rs.getString("codice");
   str="SELECT * from tabella_speciale"
   rs2 = stmt2.executeQuery(str);
   if(rs2.next())
   {
      out.println("\ndato di tabella speciale");
      s = rs2.getString("campo1");
   }
   else
   {
      out.println("\ndato di tabella speciale");
      s = rs.getString("campo1");
   }
}
Il problema è che dopo aver trovato il primo record di rs2 il ciclo
while termina... invece dovrebbe continuare fino alla fine.
Spero possiate aiutarmi, grazie mille in anticipo
Carmelo




if ??? 


Si. Deve prendere il primo record nella tabella_speciale... il while è
sul ResultSet RS, che punta alla tabella_base...

 Carmelo
Ecco come avrei scritto io il codice tenendo presente che :
  - le JOIN si fanno con un unica query
  - non sono pratico di JDBC
  - avrei usato JPA
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
final Connection conn = 
DriverManager.getConnection("jdbc:odbc:miodb;...........);
final Statement stmt=conn.createStatement();
final ResultSet rs = stmt.executeQuery("SELECT * from tabella_base");
while (rs.next())
{
    final Statement stmt2=conn.createStatement();
    final String cod = rs.getString("codice");
    final ResultSet rs2 =
	stmt2.executeQuery("SELECT * from tabella_speciale");
    while(rs2.next())
    {
       String s = rs2.getString("campo1");
       out.println("dato di tabella speciale : " + s);
    }
    stmt.close();  // giusto ?
}
-- 
Andrea Francia
http://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-windows.html


Allora stampa il numero delle righe ottenute dalla query select e 
controlla che sia uguale a quello che ti aspetti.
Stampa anche cod e verifica che sia quello che ti aspetti.


 Andrea Franciahttp://
andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-window.
..
Se non eseguo if(rs.next()) il numero di righe è corretto. Pare che il
while si interrompa non appena rs2 contenga un risultato...

 while si interrompa non appena rs2 contenga un risultato...
Queste informazioni sono troppo poche per poterti dare aiuto.
Se fornisci il nuovo codice e l'output generato si potrebbe capire di piu'.


 Andrea Franciahttp://
andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-window.
..
Non credo sia giusto mettere l'istruzione stmt.close() dentro il while
di rs, dato che deve ciclare fino alla fine del ResultSet rs...
Intendevi forse stmt2.close() ??

 Intendevi forse stmt2.close() ??
Sì mi sono sbagliato.
-- 
Andrea Francia
http://www.andreafrancia.it/


wrote:

Che ne pensate del seguente codice?
Connection conn = null;
ResultSet rs = null;
Statement stmt = null;
try
{
	String DRIVER = "sun.jdbc.odbc.JdbcOdbcDriver";
	Class.forName(DRIVER);
	conn=DriverManager.getConnection("jdbc:odbc:miodb;....);
	query="SELECT * from tabella_base"
	stmt=conn.createStatement();
	rs = stmt.executeQuery(query);
	while (rs.next())
	{
	   cod = rs.getString("codice");
	   query="SELECT * from tabella_speciale"
	   Statement stmt2=conn.createStatement();
	   ResultSet rs2 = stmt2.executeQuery(query);
	   if(rs2.next())
	   {
	      out.println("\ndato di tabella speciale");
	      s = rs2.getString("campo1");
	   }
	   else
	   {
	      out.println("\ndato di tabella speciale");
	      s = rs.getString("campo1");
	   }
	   try
	   {
	       if (rs2 != null)
	           rs2.close();
	   }
	   catch (Exception e)
	   {
	       out.println(e);
	   }
	   try
	   {
	       if (stmt2 != null)
	           stmt2.close();
	   }
	   catch (Exception e)
	   {
	       out.println(e);
	   }
	}
}
catch(Exception e)
{
	out.println(e);
}
finally
{
	try
	{
	    if (rs != null)
	        rs.close();
	}
	catch (Exception e)
	{
	    out.println(e);
	}
	try
	{
	    if (stmt != null)
	        stmt.close();
	}
	catch (Exception e)
	{
	    out.println(e);
	}
	try
	{
	    if (conn  != null)
	        conn.close();
	}
	catch (SQLException e)
	{
	    out.println(e);
    	}
}
Spero possiate aiutarmi perchè non capisco cosa c'è che non va...


Pare proprio che il while esterno termini quando l'IF interno trova il
primo risultato.
Ho provato ad eliminare l'IF interno, e vengono scanditi correttamente
tutti i record del while esterno...
L'istruzione che causa il blocco del while esterno è if(rs2.next()).
Il blocco però, ripeto, non avviene subito, ma dopo la prima volta che
la condizione dell'IF interno risulta true, anche se elimino tutte le
istruzioni contenute in questo blocco if. Per la terminazione del
while esterno è sufficiente che risulti vero if(rs2.next()).
Spero riusciate ad aiutarmi a risolvere la questione
Grazie mille in anticipo
Carmelo


L'idea che ti hanno dato sul newsgroup in inglese potrebbe essere buona.
Forse il driver che stai usando consente di usare un solo statement per 
connessione. Risolveresti usando una vera JOIN.


 Andrea Franciahttp://
andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-window.
..
Ho risolto il problema utilizzando una diversa Connection per ogni
Statement. Adesso funziona correttamente senza alcun problema... :-)

 Statement. Adesso funziona correttamente senza alcun problema... :-)
Attento che due connection diverse vivono in due transazioni diverse.
