parametros example ejemplo descargar consultas con java jdbc

java - example - ¿Por qué es "while(rs.next())" necesario aquí?



jdbc java descargar (5)

Quiero seleccionar el número de línea máximo de mi base de datos " Registros " y almacenarlo en una variable m .

Aquí está mi código:

ResultSet rs = stmt.executeQuery("Select max(Line) as L from logs"); while (rs.next()) { // Why do I need this int m = rs.getInt("L"); System.out.println(m); }

Pero no funciona a menos que use while(rs.next()) .

Si entiendo correctamente, rs.next( ) mueve el cursor a la siguiente fila, pero aquí, en este resultado, solo tengo una fila .

Entonces, ¿alguien puede explicar por qué es necesario el ciclo? Lo único que se me ocurre es que el primer cursor está en el nombre de la columna, ¿estoy en lo cierto?


Un cursor ResultSet se coloca inicialmente antes de la primera fila, la primera llamada al método siguiente hace que la primera fila sea la fila actual, la segunda llamada hace que la segunda fila sea la fila actual, y así sucesivamente.

considera que tienes algo como esto.

->1->2->3 ^

su "rs" inicialmente se apunta antes de 1, cuando llama a rs.next () avanza la flecha para apuntar a 1

->1->2->3 ^

entonces si no llamas al método next () entonces no obtienes el resultado.

Espero que esto ayude


¿Por qué?

El cursor se coloca inicialmente antes del primer elemento. Debe avanzar una vez para acceder al primer elemento.

Obviamente, esto se hizo porque atravesar los resultados usando un bucle es muy conveniente, como puede ver. De la documentación oficial :

Mueve el cursor hacia adelante una fila desde su posición actual. Un cursor ResultSet se coloca inicialmente antes de la primera fila ; la primera llamada al método siguiente convierte a la primera fila en la fila actual; la segunda llamada hace que la segunda fila sea la fila actual, y así sucesivamente.

Solución

Entonces, si bien no necesita ningún bucle, debe avanzar el cursor una vez. Un solo rs.next(); técnicamente sería suficiente:

rs.next(); // Access the result

Sin embargo, es probable que desee dar cuenta del caso en el que no hubo ninguna coincidencia, ya que:

Cuando una llamada al next método devuelve false , el cursor se posiciona después de la última fila. Cualquier invocación de un método ResultSet que requiera una fila actual dará como resultado una SQLException lanzada.

Entonces el código fallaría en este caso.

Por eso, debe dar cuenta del caso y usar el boolean devuelto para proteger su acceso:

if (rs.next()) { // Access result ... } else { // No match ... }


De la documentación oficial (que debería haber leído por cierto):

Inicialmente, el cursor se posiciona antes de la primera fila. El siguiente método mueve el cursor a la siguiente fila, y como devuelve falso cuando no hay más filas en el objeto ResultSet, puede usarse en un ciclo while para iterar a través del conjunto de resultados.

Básicamente necesitas moverlo, en tu caso moverlo una vez es suficiente:

rs.next(); System.out.println(rs.getInt("L"));


Hay diferentes tipos de ejecutar los comandos. Los cursores se usan para leer los datos de las consultas ejecutadas. Cuando se ejecuta en Lectura, se usa el Cursor de solo adelanto por defecto, por lo tanto, solo se obtiene el siguiente resultado después de llamar a Recorset.Next ()! No quiero entrar mucho más profundo aquí. Puede leer sobre los cursores aquí: https://docs.microsoft.com/en-us/sql/ado/guide/data/types-of-cursors-ado?view=sql-server-2017

La mejor solución en su caso es usar Scalar Resultset, que devolverá solo UNA CELDA, es exactamente lo que quiere implementar sin tener que recorrer su conjunto de resultados. El siguiente ejemplo muestra cómo puede implementar tales:

using System; using System.Data; using System.Data.SqlClient; class ExecuteScalar { public static void Main() { SqlConnection mySqlConnection =new SqlConnection("server=(local)//SQLEXPRESS;database=MyDatabase;Integrated Security=SSPI;"); SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.CommandText ="SELECT COUNT(*) FROM Employee"; mySqlConnection.Open(); int returnValue = (int) mySqlCommand.ExecuteScalar(); Console.WriteLine("mySqlCommand.ExecuteScalar() = " + returnValue); mySqlConnection.Close(); } }

Estamos utilizando ExecuteScalar para devolver solo UNA Célula. Recuerde, incluso si su consulta devuelve varias filas / columnas, esto solo devolverá MUY PRIMERA CELDA siempre.


Puede convertir esto para usar una instrucción if simple en if lugar.

if(rs.next()) { // other code here }

Utilizarías cuando tengas más de una fila para traer de vuelta.