Newsgroup: it.comp.java
Titolo: Problemi su problemi da query su servlet

Come mai oltre al problema già citato riscontro anche dei problemi sulle 
servlet: quando faccio una semplice query del tipo "SELECT * FROM tabella" 
(con tabella regolarmente popolata) mi dice che le righe sono 0 del 
ResultSet... mentre la connessione risulta effettuata.
Potete aiutarmi sono disperatoo!!!
Grazie
robb 

 ResultSet... mentre la connessione risulta effettuata.
Eh, come mai... di sicuro è un programma da debuggare, e anche con tutta 
la buona volontà (che non ho) finchè rimani l'unico a vedere il codice è 
un po' difficile che qualcuno faccia il debug per conto tuo.


Io posso postare il codice ma ripeto che sulla servlet non mi esegue la 
query.
E' un po' grezzo il modo in cui lo assegno all'array ma non ho voglia di 
pensarne altri!!!!
La connessione è giusta perchè il programma non mi esce dopo quelle 
istruzioni.
try {
     ResultSet rs;
     int i = 0;
     rs = s.executeQuery("SELECT  * FROM votanti");
     int j = rs.getRow();
     out.println("<p>Number of Rows: "+Integer.toString(j)+"</p>");
       //MI STAMPA CHE LE RIGHE SONO 0!!!!
     rs.first();
     String [][]result = new String [j][2];
     out.println("<table align=center bgcolor=\"#99CC00\" border=1>");
     out.println("<th>Name<th>Category");
     do{
      rs.absolute(++i);
      result[i-1][0] = (String) rs.getObject(1);
      result[i-1][1] = (String) rs.getObject(2);
           } while (!rs.isLast());
     i=0;
        do{
         out.println("<tr><td>"+result[i][0]+"</td>");
          out.println("<td>"+result[i][1]+"</td></tr>");
          i++;
         } while (i!=j);
   }
   catch (Exception e){ out.println("<p>"+e+"</p>");} 


Rilancio: forse sbaglio stringa di connessione 
(jdbc:mysql://
127.0.0.1/elettori
)
String url = "jdbc:mysql://localhost/elettori";
out.println("<p>Sono arrivato alla generazione di 
jdbc:mysql://
127.0.0.1/elettori
</p>");
Class.forName("com.mysql.jdbc.Driver").newInstance();
out.println("<p>arrivato a Class.forName ecc. <br>");
conn = DriverManager.getConnection(url,userName,password);
out.println("Arrivato alla connessione vera e propria!!!</p>");
String title = new String ("OK!");
Statement s = conn.createStatement();

            } while (!rs.isLast());
Questi metodi di scorrimento potrebbero non funzionare sul tuo driver 
supporta lo scorrimento in una sola direzione, oltre a essere un modo 
inutilmente capzioso.
Il resultset si scorre genericamente (e semplicemente) cosě:
while(rs.next()) {
    col1 = rs.getObject(1);
    col2 = rs.getObject(2);
    ...
}
Invece di utilizzare una matrice di stringhe utilizza una collection, 
cosě non hai bisogno di conoscere a priori il numero di righe del resultset.

Scusate amici se vi faccio perdere tempo ma io sono un mentecatto 
assoluto!!!
Il problema era che non mi muovevo all'ultimo record prima di fare
int j = rs.getRow() dovevo fare rs.last()
Cmq grazie per i consigli su come migliorare il mio codice, ma spesso per 
non incorrere in questi problemi non mi vado ad addentrare in strutture che 
non conosco!!!!
Grazie ancora
robbenson

 int j = rs.getRow() dovevo fare rs.last()
Il problema è un po' più complicato, perchè se ti muovi nell'ultimo 
record poi devi tornare sul primo per iniziare lo scorrimento, e non è 
detto che il driver te lo faccia fare. E comunque è oneroso. Il database 
generalmente esegue la query e restituisce una riga alla volta e in una 
sola direzione; questo significa che per arrivare all'ultima riga il 
ResultSet lato Java deve leggersi tutte le righe dal database, per poi 
tornare alla prima deve averle caricate tutte in memoria.
Lo scorrimento ottimale è *solo* in una direzione.

 Statement s = conn.createStatement();
Se sbagli la stringa di connessione ti becchi una bella eccezione nei
denti.
Quindi se vengono eseguite le istruzioni successive vuol dire che la
connessione ha avuto buon fine.
In ogni caso stai invocando dei metodi che potrebbero non essere
supportati dal driver in uso: controlla la documentazione del driver e
del DBMS.
Un consiglio generale: visto che hai di questi problemi invece di
lavorare in una servlet, fatti un main in cui metti in fila le 5
istruzioni che ti servono. Quando funzionano le prendi le metti nella
servlet e le condisci come si deve.
Infine un consiglio che non c'entra col fatto che la tua servlet
funziona o no: evita di usare array di array a James Rumbaugh, Grady
Booch e Ivar Jacobson verrebbero i capelli bianchi :)
Bye