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

Utilizando el código java anterior, estoy recuperando los recuentos de filas de la tabla denominada feedsCA.Uso del conjunto de resultados en el programa Java

Al tratar de recuperar los recuentos utilizando rs.getInt (1), rs.getInt (2), rs.getInt (3), que termina con decir un error como abajo,

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) 

ACTUALIZACIÓN :

La excepción anterior se ha resuelto.

Pero obtengo la siguiente excepción, para la cual no sé la razón. Por favor avise.

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) 

Así es como he actualizado mi programa. Búscame de una manera lógica, ya que puedo entender bien que el siguiente ciclo no funcionará como se requiere.

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));} 

Respuesta

12

usted tiene que mover el cursor del conjunto de resultados a una fila - ya sea por resultSet.first() o resultSet.next(). Inicialmente, el cursor apunta antes de la primera fila, de ahí su excepción.

Cuando se desea repetir la ResultSet:

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

Actualización: Para su segundo problema - (como se indica por el Casablanca) la consulta parece volver sólo una columna, y se solicita una segunda y tercero - y no se encuentran. Tenga en cuenta que en rs.getX(idx)idx es la columna, no la fila.

+0

Gracias Bozho! Por favor, actualícenme también sobre mi reciente excepción. Consulte mi pregunta actualizada – LGAP

+3

@LGAP: su consulta es 'SELECT COUNT (*) ...', que devuelve solo 1 valor. Por lo tanto, el único índice válido es 1, por eso se queja de que el índice 2 está fuera de rango. – casablanca

+0

@casablanca & Bozho Encuentra mi pregunta actualizada ... – LGAP

2

Debe usar uno de los métodos para mover el cursor ResultSet a una fila antes de usar los métodos getxxx. es decir, rs.next(), rs.first() o rs.last(). Estos métodos devuelven true si una fila válida ha sido localizado por lo que un patrón típico es

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

o para una consulta que devuelve varias filas:

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

es necesario llamar a rs.next() antes de acceder a la primera fila.

Por lo general, se le iterar sobre el conjunto de resultados como esto:

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

Actualización: Tenga en cuenta que SELECT COUNT(*) ... vuelve único campo por fila, que es el recuento. Usted puede tener varias filas, pero cada fila tendrá sólo un campo, que tiene índice 1. Es necesario iterar por las filas para obtener todos los aspectos:

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

Sin embargo, otro cambio: Es malo para asumir su consulta siempre devolverá solo 3 filas.Sin embargo, si está absolutamente seguro de esto, a continuación, puedes llamar next 3 veces de forma manual:

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

Gracias casablanca! En este caso, estoy bastante seguro de que la consulta solo devolverá tres filas. Iré por un método alternativo para cualquier otra consulta con el escenario similar. – LGAP

0

Por lo que yo sepa, su consulta no harán más que una fila y es decir, la columna, el número total de filas que tu consulta vuelve.

decir, por ejemplo:

Seleccione la cuenta (*) del EMP; En general, esta consulta devolverá un valor de 14.

lo que el código java

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

devolverá sólo un valor, es decir, 14

Así que, ¿Cómo se puede acceder rs.getString (2). Esto lanzará automáticamente una excepción que obtuviste en el segundo caso.

Cuestiones relacionadas