ejemplo clase java sql jdbc resultset record-count

clase - resultset java



¿Cómo obtengo el tamaño de un java.sql.ResultSet? (14)

¿No debería ser esta una operación bastante sencilla? Sin embargo, veo que no hay un método size() ni length() .


Bueno, si tiene un ResultSet del tipo ResultSet.TYPE_FORWARD_ONLY , quiere mantenerlo de esa manera (y no cambiar a un ResultSet.TYPE_SCROLL_INSENSITIVE o ResultSet.TYPE_SCROLL_INSENSITIVE para poder usar .last() ).

Sugiero un truco muy bueno y eficiente, donde se agrega una primera fila falsa / falsa en la parte superior que contiene el número de filas.

Ejemplo

Digamos que su consulta es la siguiente

select MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR from MYTABLE where ...blahblah...

y su salida parece

true 65537 "Hey" -32768 "The quick brown fox" false 123456 "Sup" 300 "The lazy dog" false -123123 "Yo" 0 "Go ahead and jump" false 3 "EVH" 456 "Might as well jump" ... [1000 total rows]

Simplemente refactoriza tu código a algo como esto:

Statement s=myConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); String from_where="FROM myTable WHERE ...blahblah... "; //h4x ResultSet rs=s.executeQuery("select count(*)as RECORDCOUNT," + "cast(null as boolean)as MYBOOL," + "cast(null as int)as MYINT," + "cast(null as char(1))as MYCHAR," + "cast(null as smallint)as MYSMALLINT," + "cast(null as varchar(1))as MYVARCHAR " +from_where +"UNION ALL "//the "ALL" part prevents internal re-sorting to prevent duplicates (and we do not want that) +"select cast(null as int)as RECORDCOUNT," + "MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR " +from_where);

La salida de tu consulta ahora será algo como

1000 null null null null null null true 65537 "Hey" -32768 "The quick brown fox" null false 123456 "Sup" 300 "The lazy dog" null false -123123 "Yo" 0 "Go ahead and jump" null false 3 "EVH" 456 "Might as well jump" ... [1001 total rows]

Así que solo tienes que

if(rs.next()) System.out.println("Recordcount: "+rs.getInt("RECORDCOUNT"));//hack: first record contains the record count while(rs.next()) //do your stuff


Es una forma sencilla de hacer filas-conteo.

ResultSet rs = job.getSearchedResult(stmt); int rsCount = 0; //but notice that you''ll only get correct ResultSet size after end of the while loop while(rs.next()) { //do your other per row stuff rsCount = rsCount + 1; }//end while


Estaba teniendo el mismo problema. Usando ResultSet.first() de esta manera justo después de que la ejecución lo resolviera:

if(rs.first()){ // Do your job } else { // No rows take some actions }

Documentación ( link ):

boolean first() throws SQLException

Mueve el cursor a la primera fila en este objeto ResultSet .

Devoluciones:

true si el cursor está en una fila válida; false si no hay filas en el conjunto de resultados

Tiros

SQLException : si se produce un error de acceso a la base de datos; este método se llama en un conjunto de resultados cerrado o el tipo de conjunto de resultados es TYPE_FORWARD_ONLY

SQLFeatureNotSupportedException : si el controlador JDBC no admite este método

Ya que:

1.2


Hoy, utilicé esta lógica por la que no sé contar con RS.

int chkSize = 0; if (rs.next()) { do { ..... blah blah enter code here for each rs. chkSize++; } while (rs.next()); } else { enter code here for rs size = 0 } // good luck to u.


La forma de obtener el tamaño de ResultSet, no es necesario utilizar ArrayList, etc.

int size =0; if (rs != null) { rs.beforeFirst(); rs.last(); size = rs.getRow(); }

Ahora obtendrá el tamaño, y si desea imprimir el ResultSet, antes de imprimir utilice la siguiente línea de código también,

rs.beforeFirst();


Ponle un nombre a la columna ..

String query = "SELECT COUNT(*) as count FROM

Haga referencia a esa columna del objeto ResultSet en un int y haga su lógica desde allí.

PreparedStatement statement = connection.prepareStatement(query); statement.setString(1, item.getProductId()); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()) { int count = resultSet.getInt("count"); if (count >= 1) { System.out.println("Product ID already exists."); } else { System.out.println("New Product ID."); } }


Revisé el valor de tiempo de ejecución de la interfaz ResultSet y descubrí que era prácticamente un ResultSetImpl todo el tiempo. ResultSetImpl tiene un método llamado getUpdateCount() que devuelve el valor que está buscando.

Este ejemplo de código debería ser suficiente:
ResultSet resultSet = executeQuery(sqlQuery);
double rowCount = ((ResultSetImpl)resultSet).getUpdateCount()

Me doy cuenta de que, por lo general, no es un buen procedimiento descartar, pero este método todavía no me ha fallado.


[Consideración de la velocidad]

La cantidad de ppl aquí sugiere ResultSet.last() pero para eso necesitarías abrir la conexión como ResultSet.TYPE_SCROLL_INSENSITIVE que para la base de datos incorporada de Derby es 10 veces más BAJA que ResultSet.TYPE_FORWARD_ONLY .

De acuerdo con mis micro-pruebas para bases de datos Derby y H2 incorporadas, es significativamente más rápido llamar a SELECT COUNT(*) antes de SELECT.

Aquí está con más detalle mi código y mis puntos de referencia.


resultSet.last() seguido de resultSet.getRow() le dará el recuento de filas, pero puede que no sea una buena idea ya que puede significar leer toda la tabla a través de la red y desechar los datos. Hacer una SELECT COUNT(*) FROM ... consulta en su lugar.


rs.last() una excepción al usar rs.last()

if(rs.last()){ rowCount = rs.getRow(); rs.beforeFirst(); }

:

java.sql.SQLException: Invalid operation for forward only resultset

se debe a que por defecto es ResultSet.TYPE_FORWARD_ONLY , lo que significa que solo puede usar rs.next()

la solucion es:

stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);


String sql = "select count(*) from message"; ps = cn.prepareStatement(sql); rs = ps.executeQuery(); int rowCount = 0; while(rs.next()) { rowCount = Integer.parseInt(rs.getString("count(*)")); System.out.println(Integer.parseInt(rs.getString("count(*)"))); } System.out.println("Count : " + rowCount); }


ResultSet rs = ps.executeQuery(); int rowcount = 0; if (rs.last()) { rowcount = rs.getRow(); rs.beforeFirst(); // not rs.first() because the rs.next() below will move on, missing the first element } while (rs.next()) { // do your standard per row stuff }


int i = 0; while(rs.next()) { i++; }


theStatement=theConnection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet theResult=theStatement.executeQuery(query); //Get the size of the data returned theResult.last(); int size = theResult.getRow() * theResult.getMetaData().getColumnCount(); theResult.beforeFirst();