El conjunto de resultados no tiene ningún método para hasNext. Quiero comprobar si el conjunto de resultados tiene ningún valor

es esta la forma correcta

if (!resultSet.next() ) {
    System.out.println("no data");
} 
InformationsquelleAutor kal | 2009-05-15

21 Comentarios

  1. 226

    Que es correcto, inicialmente el ResultSet‘s cursor señala antes de la primera fila, si la primera llamada a next() devuelve false entonces no se disponía de datos en el ResultSet.

    Si utiliza este método, usted tendrá que llamar a beforeFirst() inmediatamente después de reiniciarlo, ya que se ha posicionado más allá de la primera fila ahora.

    Debe señalarse, sin embargo, que Seifer la respuesta a continuación es una solución más elegante a esta pregunta.

    • Pero tenga en cuenta, si no /se/ filas, después de que la prueba va a estar apuntando a la primera fila. Así que asegúrese de que no querer saltar de una fila.
    • Buen punto que el cursor (puntero) se apunta a la primera fila
    • tienes razón, para resolver el problema de saltar la primera fila, he utilizado un do { … } while (rs.siguiente);
    • También puede llamar a isBeforeFirst() para probar si hay filas devueltas sin avanzar el cursor y, a continuación, proceder normalmente.
  2. 506

    Asumiendo que usted está trabajando con un recién regresó ResultSet en la que el cursor apunte antes de la primera fila, una manera más fácil de comprobar esto es llamar a sólo isBeforeFirst(). Esto evita tener que retroceder si los datos se va a leer.

    Como se explica en la documentación, este devuelve false si el cursor no está antes del primer registro o si que no hay filas en el conjunto de resultados.

    if (!resultSet.isBeforeFirst() ) {    
        System.out.println("No data"); 
    } 

     

    • Gracias, sí, lo sé, pero me encontré con el mismo problema y no estaba contento con el aspecto de avanzar para comprobar, a continuación, hacia atrás para leer. Pensé que esta solución más simple sería el beneficio de otros que están en la misma situación.
    • Tenga en cuenta que, al menos para DB2, el conjunto de resultados tiene que ser un «desplazable» tipo. Esto se puede configurar cuando se crea la instrucción a ser ejecutada.
    • Felype la respuesta de abajo es más completo
    • A partir de la Documentación de Oracle: Nota:el Soporte para la isBeforeFirst método es opcional para los conjuntos de resultados con un conjunto de resultados tipo de TYPE_FORWARD_ONLY
  3. 49

    siempre se puede hacer la siguiente parte delantera, y acaba de hacer un post de bucle de verificación

    if (!resultSet.next() ) {
        System.out.println("no data");
    } else {
    
        do {
         //statement(s)
        } while (resultSet.next());
    }
  4. 19

    Se suele hacer algo como esto:

    while ( resultSet.next() ) { 
       //Read the next item
       resultSet.getString("columnName");
    }

    Si quieres reportar un conjunto vacío, añadir una variable de conteo de los elementos de lectura. Si usted sólo necesita leer un solo elemento, entonces el código es la adecuada.

  5. 12

    Para estar totalmente seguro de que más bien el conjunto de resultados vacío o no, independientemente de la posición del cursor, me gustaría hacer algo como esto:

    public static boolean isMyResultSetEmpty(ResultSet rs) throws SQLException {
        return (!rs.isBeforeFirst() && rs.getRow() == 0);
    }

    Esta función devolverá true si el conjunto de resultados vacío, falso si no o lanzar una SQLException si ese conjunto de resultados es cerrado/sin inicializar.

  6. 8

    Mejor uso conjunto de resultados.next() junto con la do {…} while() la sintaxis para este.

    La «verificación de los resultados de la llamada» de conjunto de resultados.next() mueve el cursor a la primera fila, por lo que el uso de la do {…} while() la sintaxis para proceso de la fila, mientras que de continuar con el proceso resto de filas devueltas por el bucle.

    De esta manera se consigue para comprobar los resultados, mientras que al mismo tiempo también el procesamiento de los resultados devueltos.

    if(resultSet.next()) { //Checks for any results and moves cursor to first row,
        do { //Use 'do...while' to process the first row, while continuing to process remaining rows
    
        } while (resultSet.next());
    }
  7. 8

    De acuerdo a la más viable para responder a la sugerencia es usar «isBeforeFirst()». Que no es la mejor solución si usted no tiene un «adelante sólo tipo».

    Hay un método llamado «.primero()«. Es menos overkill para obtener el mismo resultado. Compruebe si hay algo en el «resultset» y no avanza el cursor.

    La documentación que se indica: «(…) falso si no hay no hay filas en el conjunto de resultados«.

    if(rs.first()){
        //do stuff      
    }

    También puede llamar a isBeforeFirst() para comprobar si hay filas devueltas sin avanzar el cursor y, a continuación, proceder normalmente. – SnakeDoc Sep 2 ’14 a las 19:00

    Sin embargo, hay una diferencia entre «isBeforeFirst()» y» ()». En primer lugar genera una excepción si se hace en un conjunto de resultados de tipo «sólo hacia adelante».

    Comparar los dos lanzar secciones:
    http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#isBeforeFirst()
    http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#first()

    Bueno, básicamente esto significa que usted debe utilizar «isBeforeFirst» siempre y cuando usted tiene un «adelante» sólo tipo. De lo contrario, es menos excesiva para el uso «(primer)».

    • ¿Cómo es «menos overkill» para obtener el mismo resultado? A mí me parece que el propósito de la primera() es para mover el cursor a la primera fila, si no está ya allí (y devuelva true si se tuvo éxito). isBeforeFirst es puramente una función de diagnóstico y sólo parece más adecuada hacia propósitos de los autores. Además, la manera en primer lugar() está redactado, devuelve true mientras se está «en una fila válida»… lo cual es extraño como uno podría pensar que sería redactado como «en la primera fila». Para mí, no veo la ventaja de usar primero() en este escenario, a menos que el cursor ha avanzado y desea traer de vuelta al principio.
  8. 5

    Que si quieres ver si hay alguna de las filas del conjunto de resultados sí.

    Nota que next() siempre se mueve a la siguiente fila, así que si usted está planeando en hacer la lectura del conjunto de resultados que usted necesita para tener en cuenta.

    Habitual el uso del conjunto de resultados (cuando de la simple lectura) es:

    while (resultSet.next())
    {
       ... read from the row here ...
    }

    Que obviamente no funcionará correctamente si se invoca next() una vez que ya para comprobar si el conjunto de resultados estaba vacía, así que cuidado con eso. Aunque hay métodos para «copia de seguridad», que no son compatibles con todos los tipos de conjuntos de resultados.

  9. 5

    Este es un práctico y fácil de leer pieza creo.

            if (res.next()) {
                do {
    
                    //successfully in. do the right things.
    
                } while (res.next());
            } else {
               //no results back. warn the user.
            }
  10. 2
    if (!resultSet.isAfterLast() ) {    
    System.out.println("No data"); 
    } 

    isAfterLast() también devuelve false para el conjunto de resultados vacío, pero desde el cursor antes de la primera fila de todos modos, este método parece más claro.

  11. 1

    La mejor cosa para hacer es comprobar la primera fila de modo que cuando se desea obtener los datos que usted puede evitar el error de saltarse una fila. Algo como: if (!el conjunto de resultados.primero() ) { System.a cabo.println(«no hay datos»); }

  12. 1

    Mediante el uso conjunto de resultados.next() usted puede conseguir fácilmente el resultado, si el conjunto de resultados que contiene cualquier valor o no

    ResultSet resultSet = preparedStatement.executeQuery();
    if(resultSet.next())
     //resultSet contain some values
    else
     //empty resultSet
    • No repita las respuestas existentes.
  13. 1

    He estado tratando de establecer la fila actual para el primer índice (que se ocupa de las claves primarias). Yo sugeriría

    if(rs.absolute(1)){
        System.out.println("We have data");
    } else {
        System.out.println("No data");
    }

    Cuando el conjunto de resultados se rellena, se señala antes de la primera fila. Cuando se establece la primera fila (indicado por rs.absolute(1)) devolverá true denota fue colocado con éxito en la fila 1, o false si la fila no existe. Podemos extrapolar esto a

    for(int i=1; rs.absolute(i); i++){
        //Code
    }

    que establece la fila actual a la posición i y fallará si la fila no existe. Esto es sólo un método alternativo para

    while(rs.next()){
        //Code
    }
    • ¿Cuál es tu Respuesta?
  14. 1

    He creado el siguiente método para comprobar si un conjunto de resultados vacío.

    public static boolean resultSetIsEmpty(ResultSet rs){        
        try {
            //We point the last row
            rs.last();
            int rsRows=rs.getRow(); //get last row number
    
            if (rsRows == 0) {
                return true;
            }
    
            //It is necessary to back to top the pointer, so we can see all rows in our ResultSet object.
            rs.beforeFirst();
            return false;
        }catch(SQLException ex){            
            return true;
        }
    }

    Es muy importante tener las siguientes consideraciones:

    CallableStatement objeto debe ser programados para dejar a objeto ResultSet ir al final y volver a la parte superior.

    TYPE_SCROLL_SENSITIVE: objeto ResultSet puede cambiar al final y volver a la parte superior. Además puede coger últimos cambios.

    CONCUR_READ_ONLY: podemos leer el objeto ResultSet de datos, pero no se puede actualizar.

    CallableStatement proc = dbconex.prepareCall(select, ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
  15. 1

    Creo que la forma más sencilla para comprobar el conjunto de resultados es a través de CollectionUtils bajo el paquete org.apache.commons.las colecciones.CollectionUtils

    if(CollectionUtils.isNotEmpty(resultList)){
      /**
      * do some stuff
      */
    }

    Esto comprobará null así como el conjunto de resultados vacío condición.

    Para información más detallada, puede consultar el siguiente doc.
    CollectionUtils

    • El conjunto de resultados no es una Colección.
  16. 1

    ¿Por qué no utilizar rs.getRow()?

    int getRow()
               throws SQLException
    Retrieves the current row number. The first row is number 1, the second number 2, and so on.
    Note:Support for the getRow method is optional for ResultSets with a result set type of TYPE_FORWARD_ONLY
    
    Returns:
    the current row number; 0 if there is no current row
    Throws:
    SQLException - if a database access error occurs or this method is called on a closed result set
    SQLFeatureNotSupportedException - if the JDBC driver does not support this method
    Since:
    1.2

    Para mí comprobar «si (rs.getRow() != 0)» parece funcionar bien.

  17. 1
    if(resultSet.first) {
    
    } else { 
        system.out.println("No raw or resultSet is empty");
    }

    Porque si el conjunto de resultados no tiene raw, a continuación, resultSet.first devuelve false.

    • Pero no se mueve el cursor a la primera fila innecesarios, y se puede confundir aún más el uso de obstetricia «reset» objeto y la posible pérdida de datos
  18. 0

    puede hacer algo como esto

    boolean found = false;
    
    while ( resultSet.next() )
    {
        found = true;
        resultSet.getString("column_name");
    }
    
    if (!found)
        System.out.println("No Data");
    • WAAAY complicado.
  19. 0
    ResultSet rs = rs.executeQuery();
    if(rs.next())
    {
      rs = rs.executeQuery();
      while(rs.next())
      {
        //do code part
      }
    }
    else
    {
      //else if no result set
    }

    Es mejor volver a ejecutar la consulta, porque cuando nos llame if(rs.next()){....} primera fila del conjunto de resultados será ejecutado y después en el interior de while(rs.next()){....} vamos a obtener el resultado de la siguiente línea. Así que creo que la re-ejecución de la consulta dentro de if es la mejor opción.

    • -1 Esto no es una mejor opción. ¿Por qué la consulta de la base de datos dos veces? Lo que si los datos cambia drásticamente entre las llamadas? Esto es un desperdicio.
  20. -2

    Inicialmente, el conjunto de resultados de objeto (rs) puntos para el BFR (antes del primer registro). Una vez que el uso de rs.next(), el cursor puntos para el primer registro y el rs tiene «verdadero». Utilizando el bucle while puede imprimir todos los registros de la tabla. Después de que todos los registros se recuperan, el cursor se mueve a la ALR (Después del último registro) y se establece en null. Consideremos que hay 2 registros en la tabla.

    if(rs.next()==false){
        //there are no records found
        }    
    
    while (rs.next()==true){
        //print all the records of the table
        }

    En breve de la mano, también podemos escribir la condición while (rs.next()).

    • Su mientras que el bucle no se dan la oportunidad de operar en la primera fila devuelta, que parece algo falla fatal con este enfoque. Hay un montón de sugerencias sobre que son mejores que este.

Dejar respuesta

Please enter your comment!
Please enter your name here