vacio tiene tamaño saber registros recorrer obtener nombre llenar getmetadata esta datos cuantos con como columna java jdbc resultset

tiene - recorrer resultset java



¿Cómo obtener el recuento de filas usando ResultSet en Java? (13)

Acabo de hacer un método getter.

public int getNumberRows(){ try{ statement = connection.creatStatement(); resultset = statement.executeQuery("your query here"); if(resultset.last()){ return resultset.getRow(); } else { return 0; //just cus I like to always do some kinda else statement. } } catch (Exception e){ System.out.println("Error getting row count"); e.printStackTrace(); } return 0; }

Intento crear un método simple que reciba un ResultSet como parámetro y devuelva un int que contenga el recuento de filas del ResultSet. ¿Es esta una manera válida de hacer esto o no tanto?

int size = 0; try { while(rs.next()){ size++; } } catch(Exception ex) { System.out.println("------------------Tablerize.getRowCount-----------------"); System.out.println("Cannot get resultSet row count: " + ex); System.out.println("--------------------------------------------------------"); }

Intenté esto:

int size = 0; try { resultSet.last(); size = resultSet.getRow(); resultSet.beforeFirst(); } catch(Exception ex) { return 0; } return size;

Pero recibí un error que decía com.microsoft.sqlserver.jdbc.SQLServerException: The requested operation is not supported on forward only result sets.

Gracias de antemano por los punteros!


Aquí hay un código que evita que el conteo cree una instancia de una matriz, pero usa una lista de arreglos en su lugar y justo antes de regresar convierte ArrayList al tipo de matriz necesaria.

Tenga en cuenta que la clase Supervisor implementa aquí la interfaz ISupervisor, pero en Java no puede convertir desde el objeto [] (que el método simple de ArrayList a Array () retorna) a ISupervisor [] (como creo que puede hacer en C #), por lo que tiene que iterar a través de todos los elementos de la lista y poblar la matriz de resultados.

/** * Get Supervisors for given program id * @param connection * @param programId * @return ISupervisor[] * @throws SQLException */ public static ISupervisor[] getSupervisors(Connection connection, String programId) throws SQLException { ArrayList supervisors = new ArrayList(); PreparedStatement statement = connection.prepareStatement(SQL.GET_SUPERVISORS); try { statement.setString(SQL.GET_SUPERVISORS_PARAM_PROGRAMID, programId); ResultSet resultSet = statement.executeQuery(); if (resultSet != null) { while (resultSet.next()) { Supervisor s = new Supervisor(); s.setId(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ID)); s.setFirstName(resultSet.getString(SQL.GET_SUPERVISORS_RESULT_FIRSTNAME)); s.setLastName(resultSet.getString(SQL.GET_SUPERVISORS_RESULT_LASTNAME)); s.setAssignmentCount(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ASSIGNMENT_COUNT)); s.setAssignment2Count(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ASSIGNMENT2_COUNT)); supervisors.add(s); } resultSet.close(); } } finally { statement.close(); } int count = supervisors.size(); ISupervisor[] result = new ISupervisor[count]; for (int i=0; i<count; i++) result[i] = (ISupervisor)supervisors.get(i); return result; }



El ResultSet tiene sus métodos que mueven el Cursor hacia adelante y hacia atrás dependiendo de la opción provista. De forma predeterminada, se mueve hacia adelante (TYPE_FORWARD_ONLY tipo de conjunto de resultados). A menos que CONSTANTS indique la capacidad de búsqueda y la actualización del conjunto de resultados correctamente, puede terminar obteniendo un error. Ej. Antes de Last () Este método no tiene efecto si el conjunto de resultados no contiene filas. Lanza un error si no es TYPE_FORWARD_ONLY.

La mejor forma de comprobar si se obtuvieron las filas vacías --- Solo para insertar un nuevo registro después de verificar que no existe

if( rs.next() ){ Do nothing } else { No records fetched! }

Mira here


Haga una consulta SELECT COUNT(*) FROM ... lugar.


La mayoría de los controladores admiten solo el conjunto de resultados de reenvío, por lo que no se admiten los métodos como último, anterior aPrimero, etc.

El primer enfoque es adecuado si también está obteniendo los datos en el mismo ciclo; de lo contrario, resultSet ya se ha iterado y no se puede volver a utilizar.

En la mayoría de los casos, el requisito es obtener el número de filas que devolverá una consulta sin recuperar las filas. Iterar a través del conjunto de resultados para encontrar el recuento de filas es casi lo mismo que procesar los datos. En su lugar, es mejor hacer otra consulta de conteo (*).


Otros ya han respondido cómo resolver su problema, por lo que no repetiré lo que ya se ha dicho, pero diré esto: probablemente deba encontrar una manera de resolver sus problemas sin conocer el recuento del conjunto de resultados antes de leer el resultados.

Hay muy pocas circunstancias en las que el recuento de filas realmente se necesita antes de leer el conjunto de resultados, especialmente en un lenguaje como Java. El único caso en el que pienso que un recuento de filas sería necesario es cuando el recuento de filas es la única información que necesita (en cuyo caso una consulta de recuento sería superior). De lo contrario, es mejor utilizar un objeto contenedor para representar los datos de su tabla y almacenarlos en un contenedor dinámico como ArrayList. Luego, una vez que el conjunto de resultados se ha repetido, puede obtener el recuento de la lista de matrices. Para cada solución que requiere conocer el recuento de filas antes de leer el conjunto de resultados, probablemente pueda pensar en una solución que lo haga sin conocer el recuento de filas antes de leer sin mucho esfuerzo. Al pensar en soluciones que omiten la necesidad de conocer el recuento de filas antes del procesamiento, guarda el ResultSet el problema de desplazarse hasta el final del conjunto de resultados, y luego volver al principio (lo que puede ser una operación MUY costosa para grandes conjuntos de resultados) .

Ahora, por supuesto, no estoy diciendo que nunca haya situaciones en las que necesite el recuento de filas antes de leer un conjunto de resultados. Solo digo que en la mayoría de las circunstancias, cuando las personas piensan que necesitan el recuento de los conjuntos de resultados antes de leerlo, probablemente no lo hagan, y vale la pena tomarse 5 minutos para pensar si hay otra forma.

Solo quería ofrecer mis 2 centavos sobre el tema.


Seguir dos opciones funcionó para mí:

1) Una función que devuelve el número de filas en su ResultSet.

private int resultSetCount(ResultSet resultSet) throws SQLException{ try{ int i = 0; while (resultSet.next()) { i++; } return i; } catch (Exception e){ System.out.println("Error getting row count"); e.printStackTrace(); } return 0; }

2) Cree una segunda instrucción SQL con la opción COUNT.


Si tiene acceso a la declaración preparada que da como resultado este conjunto de resultados, puede usar

connection.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Esto prepara su extracto de manera que puede rebobinar el cursor. Esto también está documentado en el ResultSet Javadoc

En general, sin embargo, los cursores de reenvío y rebobinado pueden ser bastante ineficaces para grandes conjuntos de resultados. Otra opción en SQL Server sería calcular el número total de filas directamente en su declaración SQL:

SELECT my_table.*, count(*) over (partition by 1) total_rows FROM my_table WHERE ...


Si tiene una tabla y almacena la ID como incremento primario y automático, entonces esto funcionará

Código de ejemplo para obtener el recuento total de filas http://www.java2s.com/Tutorial/Java/0340__Database/GettheNumberofRowsinaDatabaseTable.htm

A continuación está el código

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; public class Main { public static void main(String[] args) throws Exception { Connection conn = getConnection(); Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); st.executeUpdate("create table survey (id int,name varchar(30));"); st.executeUpdate("insert into survey (id,name ) values (1,''nameValue'')"); st.executeUpdate("insert into survey (id,name ) values (2,null)"); st.executeUpdate("insert into survey (id,name ) values (3,''Tom'')"); st = conn.createStatement(); ResultSet rs = st.executeQuery("SELECT * FROM survey"); rs = st.executeQuery("SELECT COUNT(*) FROM survey"); // get the number of rows from the result set rs.next(); int rowCount = rs.getInt(1); System.out.println(rowCount); rs.close(); st.close(); conn.close(); } private static Connection getConnection() throws Exception { Class.forName("org.hsqldb.jdbcDriver"); String url = "jdbc:hsqldb:mem:data/tutorial"; return DriverManager.getConnection(url, "sa", ""); } }


Su función devolverá el tamaño de un ResultSet, pero su cursor se establecerá después del último registro, por lo que sin rebobinar al invocar beforeFirst (), first () o previous () no podrá leer sus filas y rebobinar Los métodos no funcionarán con Reenviar solo ResultSet (obtendrá la misma excepción que obtiene en su segundo fragmento de código).


su declaración de sql creando código puede ser como

statement = connection.createStatement();

Para resolver "com.microsoft.sqlserver.jdbc.SQLServerException: la operación solicitada no se admite en reenviar solo los conjuntos de resultados" cambio de excepción anterior al código con

statement = connection.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Después del cambio anterior, puede usar

int size = 0; try { resultSet.last(); size = resultSet.getRow(); resultSet.beforeFirst(); } catch(Exception ex) { return 0; } return size;

para obtener el conteo de filas


Statement s = cd.createStatement(); ResultSet r = s.executeQuery("SELECT COUNT(*) AS rowcount FROM FieldMaster"); r.next(); int count = r.getInt("rowcount"); r.close(); System.out.println("MyTable has " + count + " row(s).");

A veces JDBC no es compatible con el siguiente método, da error, como `TYPE_FORWARD_ONLY ''use esta solución

Sqlite no es compatible en JDBC.

resultSet.last(); size = resultSet.getRow(); resultSet.beforeFirst();

Entonces, en ese momento usa esta solución.

Gracias..