Comment obtenir le nombre de lignes en utilisant ResultSet en Java?

J’essaie de créer une méthode simple qui reçoit un ResultSet en tant que paramètre et renvoie un int qui contient le nombre de lignes du ResultSet. Est-ce une façon valable de faire cela ou pas tant?

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

J’ai essayé ceci:

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

Mais j’ai eu une erreur en disant com.microsoft.sqlserver.jdbc.SQLServerException: The requested operation is not supported on forward only result sets.

Merci d’avance pour les pointeurs!

Si vous avez access à l’instruction préparée qui résulte de ce jeu de résultats, vous pouvez utiliser

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

Cela prépare votre déclaration de manière à pouvoir rembobiner le curseur. Ceci est également documenté dans le Javadoc ResultSet

En général, le transfert et le rembobinage des curseurs peuvent être très inefficaces pour les jeux de résultats volumineux. Une autre option de SQL Server consisterait à calculer le nombre total de lignes directement dans votre instruction SQL:

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

votre code SQL de création de code peut être comme

 statement = connection.createStatement(); 

Pour résoudre “com.microsoft.sqlserver.jdbc.SQLServerException: l’opération demandée n’est pas prise en charge sur les jeux de résultats uniquement” modification de l’exception au-dessus du code avec

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

Après le changement ci-dessus, vous pouvez utiliser

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

obtenir le nombre de lignes

 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)."); 

Parfois, JDBC ne supporte pas la méthode suivante, ce qui donne l’erreur comme TYPE_FORWARD_ONLY.

SQLite ne prend pas en charge dans JDBC.

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

Donc, à ce moment-là, utilisez cette solution.

Merci..

Faites plutôt une requête SELECT COUNT(*) FROM ...

Je viens de faire une méthode 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; } 

Votre fonction renverra la taille d’un ResultSet, mais son curseur sera défini après le dernier enregistrement, donc sans le rembobiner en appelant beforeFirst (), first () ou previous (), vous ne pourrez pas lire ses lignes et revenir en arrière. les méthodes ne fonctionneront pas avec forward uniquement ResultSet (vous obtiendrez la même exception que vous obtenez dans votre deuxième fragment de code).

La plupart des pilotes ne supportent que les résultats – donc la méthode comme last, beforeFirst, etc. n’est pas prise en charge.

La première approche est appropriée si vous obtenez également les données dans la même boucle – sinon, le resultSet a déjà été itéré et ne peut plus être utilisé.

Dans la plupart des cas, il est nécessaire d’obtenir le nombre de lignes renvoyées par une requête sans extraire les lignes. Itérer à travers le jeu de résultats pour trouver le nombre de lignes est presque identique au traitement des données. Il est préférable de faire une autre requête count (*) à la place.

D’autres ont déjà répondu à la façon de résoudre votre problème, alors je ne répéterai pas ce qui a déjà été dit, mais je vais le dire: vous devriez probablement trouver un moyen de résoudre vos problèmes sans connaître le compte des résultats avant de lire le résultats.

Il y a très peu de circonstances où le nombre de lignes est réellement nécessaire avant de lire le jeu de résultats, en particulier dans un langage comme Java. Le seul cas auquel je pense où un nombre de lignes serait nécessaire est lorsque le nombre de lignes est la seule donnée dont vous avez besoin (auquel cas une requête de comptage serait supérieure). Sinon, il est préférable d’utiliser un object wrapper pour représenter vos données de table et stocker ces objects dans un conteneur dynamic tel qu’une ArrayList. Ensuite, une fois que le jeu de résultats a été répété, vous pouvez obtenir le nombre de listes de tableaux. Pour chaque solution qui nécessite de connaître le nombre de lignes avant de lire le jeu de résultats, vous pouvez probablement penser à une solution qui le fait sans connaître le nombre de lignes avant de lire sans trop d’effort. En pensant aux solutions qui évitent de connaître le nombre de lignes avant le traitement, vous sauvegardez le ResultSet pour qu’il défile jusqu’à la fin du jeu de résultats, puis retourne au début (ce qui peut être une opération TRES onéreuse pour les jeux de résultats volumineux). .

Maintenant, bien sûr, je ne dis pas qu’il n’y a jamais de situations où vous pourriez avoir besoin du nombre de lignes avant de lire un jeu de résultats. Je dis simplement que dans la plupart des cas, quand les gens pensent avoir besoin du décompte des résultats avant de le lire, ils ne le font probablement pas, et cela vaut la peine de prendre 5 minutes pour réfléchir à une autre solution.

Je voulais juste offrir mes 2 centimes sur le sujet.

Si vous avez une table et stockez l’ID comme incrémentation primaire et automatique, cela fonctionnera

Exemple de code pour obtenir le nombre total de lignes http://www.java2s.com/Tutorial/Java/0340__Database/GettheNumberofRowsinaDatabaseTable.htm

Ci-dessous est le code

 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(Ssortingng[] 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"); Ssortingng url = "jdbc:hsqldb:mem:data/tutorial"; return DriverManager.getConnection(url, "sa", ""); } } 

Le ResultSet a ses méthodes qui déplacent le curseur d’avant en arrière en fonction de l’option fournie. Par défaut, il se déplace vers l’avant (type de jeu de résultats TYPE_FORWARD_ONLY). À moins que CONSTANTES indique le caractère défilable et la mise à jour du jeu de résultats correctement, vous risquez de recevoir une erreur. Par exemple, beforeLast () Cette méthode n’a aucun effet si le jeu de résultats ne contient aucune ligne. Erreur si ce n’est pas TYPE_FORWARD_ONLY.

La meilleure façon de vérifier si les lignes vides ont été récupérées — Juste pour insérer un nouvel enregistrement après avoir vérifié l’absence

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

Voir ici

Voici un code qui évite que le compte instancie un tableau, mais utilise plutôt ArrayList et, juste avant de renvoyer, convertit ArrayList dans le type de tableau requirejs.

Notez que la classe Supervisor implémente ici l’interface ISupervisor, mais en Java, vous ne pouvez pas lancer d’object [] (que la méthode plain ArrayList de la méthode toArray () retourne) à ISupervisor [] (comme vous pouvez le faire en C #). doivent parcourir tous les éléments de la liste et remplir le tableau de résultats.

 /** * Get Supervisors for given program id * @param connection * @param programId * @return ISupervisor[] * @throws SQLException */ public static ISupervisor[] getSupervisors(Connection connection, Ssortingng programId) throws SQLException { ArrayList supervisors = new ArrayList(); PreparedStatement statement = connection.prepareStatement(SQL.GET_SUPERVISORS); try { statement.setSsortingng(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.getSsortingng(SQL.GET_SUPERVISORS_RESULT_FIRSTNAME)); s.setLastName(resultSet.getSsortingng(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 

Les deux options suivantes ont fonctionné pour moi:

1) Une fonction qui renvoie le nombre de lignes dans votre 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) Créez une seconde instruction SQL avec l’option COUNT.

De http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSetMetaData.html

  ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2"); ResultSetMetaData rsmd = rs.getMetaData(); int numberOfColumns = rsmd.getColumnCount(); 

Un ResultSet contient des métadonnées indiquant le nombre de lignes.