2010-10-25 12 views
8
Resultset rs=stmt.executeQuery("select count(*) from feedsca group by score order by score"); 

Utilizzando il codice java sopra riportato, sto recuperando i conteggi delle righe dalla tabella denominata feedsCA.Utilizzo di Resultset nel programma Java

Durante il tentativo di recupero dei conteggi utilizzando rs.getInt (1), rs.getInt (2), rs.getInt (3), che si conclude con un errore che dice come sotto,

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: The result set has no current row. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyResultSetHasCurrentRow(Unknown Source) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getterGetColumn(Unknown Source) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source) 
    at SimpleMail.main(SimpleMail.java:151) 

UPDATE :

L'eccezione di cui sopra è stata risolta.

Ma ottengo la seguente eccezione, per la quale non so il motivo. Si prega di avvisare.

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: The index 2 is out of range. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyValidColumnIndex(Unknown Source) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getterGetColumn(Unknown Source) 
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source) 
    at SimpleMail.main(SimpleMail.java:152) 

Ecco come ho aggiornato il mio programma. Trovami un modo logico in quanto posso capire bene che il ciclo sottostante non funzionerà come richiesto.

rs=stmt.executeQuery("select count(*) from feedsca group by score order by score"); 
while(rs.next()){ 
pw.printf(rowFormat, rs.getLong(1),"0",rs.getLong(2),rs.getLong(3));} 

risposta

12

è necessario spostare il cursore del set di risultati di una riga - mediante resultSet.first() o resultSet.next(). Inizialmente il cursore punta prima della prima riga, quindi la tua eccezione.

Quando si desidera iterare il ResultSet: Aggiornamento

while(rs.next()) { 
    ... 
} 

: Per il vostro secondo problema - (come notato da Casablanca) la query sembra tornare una sola colonna, e si chiedono per un 2 ° e 3 ° - e non sono stati trovati. Si noti che in rs.getX(idx)idx è la colonna, non la riga.

+0

Grazie Bozho! Gentilmente aggiornami anche sulla mia recente eccezione. Vedere la mia domanda aggiornata – LGAP

+3

@LGAP: la query è 'SELECT COUNT (*) ...', che restituisce solo 1 valore. Quindi l'unico indice valido è 1, ecco perché si lamenta che l'indice 2 è fuori portata. – casablanca

+0

@casablanca e Bozho Per favore, trova la mia domanda aggiornata ... – LGAP

2

È necessario utilizzare uno dei metodi per spostare il cursore ResultSet su una riga prima di utilizzare i metodi getxxx. Ad esempio rs.next(), rs.first() o rs.last(). Questi metodi restituiscono true se una riga valida è stato localizzato così un modello tipico è

if (rs.first()) { 
    int field1 = rs.getInt(1); 
    // other columns 
} 

o per una query che restituisce più righe:

while (rs.next()) { 
    int field1 = rs.getInt(1); 
    // other columns 
} 
5

è necessario chiamare rs.next() prima di accedere la prima riga.

In genere, si iterare il set di risultati come questo:

ResultSet rs = ...; 
while (rs.next()) { 
    ... 
} 

Aggiornamento: noti che SELECT COUNT(*) ... restituisce un solo campo per riga, che è il conteggio. Si può avere più righe, ma ogni riga avrà un solo campo, che ha indice 1. È necessario scorrere le righe per ottenere tutti i conteggi:

while (rs.next()) { 
    System.out.println(rs.getInt(1)); 
} 

Ancora un altro aggiornamento: È male ad assumere che la tua query restituirà sempre solo 3 righe.Tuttavia, se si è assolutamente sicuri di questo, allora si può solo chiamare next 3 volte manualmente:

long l1, l2, l3; 
rs.next(); 
l1 = rs.getLong(1); 
rs.next(); 
l2 = rs.getLong(1); 
rs.next(); 
l3 = rs.getLong(1); 
pw.printf(rowFormat, l1,"0",l2,l3); 
+0

Grazie Casablanca! In questo caso, sono abbastanza sicuro che la query restituirà solo tre righe. Vado per un metodo alternativo per qualsiasi altra query con lo scenario simile. – LGAP

0

Per quanto riguarda la mia conoscenza, la query sarà solo una riga e colonna vale a dire, il numero totale di righe la tua domanda restituisce.

diciamo per esempio:

select count (*) da emp; Generalmente questa query restituirà un valore di 14.

in modo che il codice Java

if(rs.next()) 
    rs.getInt(1); 

restituirà un solo valore vale a dire, 14

Quindi, come si può accedere rs.getString (2). Ciò genererà automaticamente un'eccezione che hai ottenuto nel secondo caso.

Problemi correlati