Comment obtenir le nombre de lignes à l'aide de ResultSet en Java?
Je suis en train de créer une méthode simple qui reçoit un jeu de résultats en tant que paramètre et retourne un int qui contient le nombre de lignes du jeu de résultats. Est-ce là une façon de faire cela ou pas tellement?
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 une erreur disant com.microsoft.sqlserver.jdbc.SQLServerException: The requested operation is not supported on forward only result sets.
Merci d'avance pour les pointeurs!
- Vous pouvez pas modifier l'instruction sql pour
SELECT COUNT(*) ...
? - Pourquoi ne pas faire un "select count(*)" avant de lancer la requête de remplissage de l'objet resultset ? Toutefois jeu d'enregistrements RS dépend de la façon dont vous ouvrez la connexion (il y a quelques paramètres à passer). Regardez votre pilote jdbc de la documentation pour plus de détails.
- (OT; vous pouvez envisager d'utiliser un enregistrement réel de la bibliothèque qui sera prendre soin des choses comme sortir le nom de la méthode etc.)
Vous devez vous connecter pour publier un commentaire.
Si vous avez accès à l'instruction préparée que les résultats dans ce jeu de résultats, vous pouvez utiliser
Cela prépare votre déclaration d'une manière que vous pouvez reculer le curseur. C'est également documentée dans le ResultSet Javadoc
En général, cependant, l'avance et le retour des curseurs peuvent être inefficaces pour les grands ensembles de résultats. Une autre option dans SQL Server serait de calculer le nombre total de lignes directement dans votre instruction SQL:
count(*) over (partition by 1)
champ, mais seulement si vous pouvez utiliser qui comptent pour des choses telles que la pagination dans une interface graphique. Si ce n'est à propos de la journalisation, puis je ne suis pas sûr si généralement obtenir le nombre de lignes est une bonne idée...ResultSet
et qu'ils veulent à compter le nombre de lignes sur l'ensemble des résultats. Ce qui me manque? "reçoit un jeu de résultats en tant que paramètre et retourne un int qui contient le nombre de lignes du jeu de résultats". Ma réponse a montré leur erreur (ne pas préciserResultSet.TYPE_SCROLL_INSENSITIVE
) et a montré une alternative. Alors, quels sont exactement vous critiquer? Une note il y a d'autres réponses que suggèrentSELECT count(*)
requêtes...votre Instruction sql de création de code peut être comme
À résoudre "com.microsoft.sqlserver.jdbc.SQLServerException: L'opération demandée n'est pas prise en charge sur l'avant seulement des ensembles de résultats" exception de changement de code ci-dessus avec
Après le changement ci-dessus, vous pouvez utiliser
pour obtenir le nombre de lignes
Parfois JDBC ne prend pas en charge la méthode suivante donne une Erreur comme "TYPE_FORWARD_ONLY' utiliser cette solution
Sqlite ne supporte pas dans JDBC.
Donc, à l'époque d'utiliser cette solution.
Merci..
Faire un
SELECT COUNT(*) FROM ...
requête à la place.Je viens de faire une méthode de lecture.
Si vous avez de la table et le stockage de l'IDENTIFIANT primaire et auto incrément alors ce sera le travail
Exemple de code pour obtenir le total du nombre de lignes http://www.java2s.com/Tutorial/Java/0340__Database/GettheNumberofRowsinaDatabaseTable.htm
Voici le code à
Votre fonction sera de retour de la taille d'un jeu de résultats, mais son curseur sera fixé après le dernier enregistrement, sans rembobinage en appelant beforeFirst(), first() ou previous (), vous ne serez pas en mesure de lire ses lignes, et le rembobinage méthodes ne fonctionnent pas avec les seules ResultSet (vous obtiendrez la même exception que vous obtenez dans votre deuxième fragment de code).
La plupart des pilotes de soutien de l'avant seulement resultset - méthode, comme la dernière, beforeFirst, etc ne sont pas pris en charge.
La première approche est appropriée si vous êtes également l'obtention de données dans la même boucle, sinon le jeu de résultats a déjà été réitéré et ne peut pas être utilisé à nouveau.
Dans la plupart des cas, l'exigence est d'obtenir le nombre de lignes affectées par une requête retourne sans aller chercher les lignes. Une itération à travers le jeu de résultats pour trouver le nombre de lignes est presque la même que le traitement des données. Il est préférable de faire un autre compte(*) de la requête à la place.
count(*) over (partition by 1)
fonction de fenêtre, même si cela peut être long pour les grands ensembles de résultats ainsi...D'autres ont déjà répondu à la façon de résoudre votre problème, donc je ne vais pas répéter ce qui a déjà été dit, mais je vous dit ceci: vous devriez probablement trouver un moyen de résoudre vos problèmes sans connaître le résultat le nombre avant la lecture à travers les résultats.
Il y a très peu de circonstances où le nombre de lignes nécessaires avant de lire la suite, surtout dans un langage comme Java. Le seul cas je pense d'où un nombre de lignes serait nécessaire, c'est quand le nombre de lignes est les seules données dont vous avez besoin(dans ce cas, un nombre de requête serait supérieure). Sinon, vous êtes mieux d'utiliser un objet wrapper pour représenter les données de la table, et de stockage de ces objets dans une dynamique conteneur comme une liste de tableaux. Ensuite, une fois que le jeu de résultats a été itéré, vous pouvez obtenir la liste de tableau de comptage. 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 n'est sans savoir que le nombre de lignes avant de lire sans trop d'effort. En pensant à des solutions qui permettent de contourner la nécessité de connaître le nombre de lignes avant le traitement, vous enregistrez le jeu de résultats de la peine de défiler jusqu'à la fin de l'ensemble de résultats, puis de nouveau au début (qui peut être une opération TRÈS coûteuse pour les grands ensembles de résultats).
Maintenant, bien sûr, je ne dis pas qu'il ne sont jamais les situations où vous avez besoin le nombre de lignes avant la lecture d'un jeu de résultats. Je dis juste que dans la plupart des cas, quand les gens pensent qu'ils ont besoin de l'ensemble de résultats de comptage avant de le lire, ils ne sont probablement pas, et il vaut la peine de prendre 5 minutes pour réfléchir à savoir si il existe une autre manière.
Je voulais juste offrir mes 2 cents sur le sujet.
Le jeu de résultats a de méthodes permettant de déplacer le Curseur d'avant en arrière en fonction de l'option prévue. Par défaut, c'est avant le déplacement(TYPE_FORWARD_ONLY de type resultset).
À moins que les CONSTANTES indiquant capacité à permettre le défilement et la mise à Jour de resultset correctement, vous risquez d'avoir une erreur.
E. g. beforeLast()
Cette méthode n'a aucun effet si le jeu de résultats contient pas de lignes.
Déclenche une Erreur si ce n'est pas TYPE_FORWARD_ONLY.
Le meilleur moyen de vérifier si les lignes vides ai récupéré --- il suffit d'insérer un nouvel enregistrement après vérification de la non-existence
Voir ici
Voici un code qui permet d'éviter l'obtention du comte d'instancier un tableau, mais utilise une liste de tableaux à la place, et juste avant de rentrer convertit la liste de tableaux le type de tableau.
Noter que Superviseur de la classe implémente ISupervisor interface, mais en Java, vous ne pouvez pas jeter de l'objet[] (qui ArrayList ordinaire de la méthode toArray() retourne) à ISupervisor[] (comme je pense que vous êtes en mesure de le faire en C#), de sorte que vous avez à parcourir tous les éléments de la liste et remplir le tableau résultat.
Une des deux options suivantes fonctionné pour moi:
1) Une fonction qui retourne le nombre de lignes dans votre jeu de résultats.
2) Créer une deuxième instruction SQL avec l'option de COMPTAGE.
De http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSetMetaData.html
Un ResultSet contient des métadonnées qui donne le nombre de lignes.