Lire le code suivant:
public class selectTable {
public static ResultSet rSet;
public static int total=0;
public static ResultSet onLoad_Opetations(Connection Conn, int rownum,String sql)
{
int rowNum=rownum;
int totalrec=0;
try
{
Conn=ConnectionODBC.getConnection();
Statement stmt = Conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sqlStmt = sql;
rSet = stmt.executeQuery(sqlStmt);
total = rSet.getRow();
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
System.out.println("Total Number of Records="+totalrec);
return rSet;
}
}
Le code suivant ne montre pas le total actuel:
total = rSet.getRow();
ma jTable affiche 4 enregistrements dans jTable mais total = 0; quand j'évalue à travers le débogage, cela montre:
total=(int)0;
plutôt que total = (int) 4 Et si j'utilise
rSet=last(); above from the code total = rSet.getRow();
alors total indique une valeur exacte = 4 mais rSet ne renvoie rien. alors jTable est vide . Mettez-moi à jour!
La réponse de BalusC est juste! mais je dois mentionner en fonction de la variable d'instance utilisateur telle que:
rSet.last();
total = rSet.getRow();
et puis qui vous manque
rSet.beforeFirst();
le code restant est le même, vous obtiendrez le résultat souhaité.
Vous devez appeler ResultSet#beforeFirst()
pour que le curseur revienne avant la première ligne avant de renvoyer l'objet ResultSet
. De cette façon, l'utilisateur pourra utiliser next()
comme d'habitude.
resultSet.last();
rows = resultSet.getRow();
resultSet.beforeFirst();
return resultSet;
Cependant, vous avez de plus gros problèmes avec le code donné jusqu'à présent. Cela laisse échapper des ressources de base de données et ce n’est pas non plus une approche appropriée OOP. Recherchez le modèle DAO. En fin de compte, vous voudriez finir comme
public List<Operations> list() throws SQLException {
// Declare Connection, Statement, ResultSet, List<Operation>.
try {
// Use Connection, Statement, ResultSet.
while (resultSet.next()) {
// Add new Operation to list.
}
} finally {
// Close ResultSet, Statement, Connection.
}
return list;
}
Ainsi, l’appelant n’a qu’à utiliser List#size()
pour connaître le nombre d’enregistrements.
Comme d'autres l'ont répondu, il est impossible d'obtenir le nombre de lignes sans effectuer une itération complète. Vous pouvez le faire, mais vous ne voudrez peut-être pas noter les points suivants:
Pour de nombreux systèmes SGBDR, ResultSet est une API de diffusion en continu, ce qui signifie Qu'il ne charge pas (ni même ne récupère) toutes les lignes du serveur de base de données Voir ceci question sur SO. En effectuant une itération à la fin Du ResultSet, vous pouvez augmenter considérablement le temps nécessaire à l'exécution de Dans certains cas.
Un objet ResultSet par défaut ne peut pas être mis à jour et comporte un curseur qui avance seulement. Je pense que cela signifie que, sauf si vous Exécutez la requête avec ResultSet.TYPE_SCROLL_INSENSITIVE
rSet.beforeFirst()
lancera SQLException
. La raison en est que c’est parce qu’il ya un coût Avec un curseur à défilement. Selon la documentation, SQLFeatureNotSupportedException
peut être lancé même si vous créez un curseur avec défilement.
Remplir et renvoyer un List<Operations>
signifie que vous allez aussi besoin de mémoire supplémentaire. Pour de très grands résultats, cela ne fonctionnera pas du tout.
La grande question est donc de savoir quel SGBDR? Dans l'ensemble, je suggérerais de ne pas enregistrer le nombre d'enregistrements.
La méthode getRow () récupère le numéro de la ligne en cours, pas le nombre de lignes. Ainsi, avant de commencer à parcourir la ResultSet
, getRow()
renvoie 0.
Pour obtenir le nombre réel de lignes renvoyées après l'exécution de votre requête, il n'y a pas de méthode free: vous êtes censé y effectuer une itération.
Cependant, si vous vraiment devez récupérer le nombre total de lignes avant de les traiter, vous pouvez:
ResultSet
normalementUn meilleur moyen serait d'utiliser l'instruction SELECT COUNT
de SQL.
Juste au moment où vous avez besoin du nombre de lignes renvoyées, exécutez une autre requête en renvoyant le nombre exact de résultats de cette requête.
try
{
Conn=ConnectionODBC.getConnection();
Statement stmt = Conn.createStatement();
String sqlStmt = sql;
String sqlrow = SELECT COUNT(*) from (sql) rowquery;
String total = stmt.executeQuery(sqlrow);
int rowcount = total.getInt(1);
}
La méthode getRow()
donnera toujours 0 après une requête:
Récupère le numéro de ligne actuel.
Deuxièmement, vous éditez totalrec
mais ne lui attribuez jamais rien.
Vous ne pouvez pas obtenir le nombre de lignes renvoyées dans un jeu de résultats sans effectuer une itération. Et pourquoi voudriez-vous renvoyer un ResultSet sans l'itérer? Il serait inutile d'exécuter la requête en premier lieu.
Une meilleure solution serait de séparer la persistance de la vue. Créez un objet d'accès aux données distinct qui gère toutes les requêtes de base de données pour vous. Laissez-le récupérer les valeurs à afficher dans la variable JTable
, chargez-les dans une structure de données, puis renvoyez-les à l'interface utilisateur pour l'affichage. L'interface utilisateur aura alors toutes les informations dont elle a besoin.
J'ai résolu ce problème. Le seul que je fais est:
private int num_rows;
Et puis dans votre méthode en utilisant le resultset mettez ce code
while (this.rs.next())
{
this.num_rows++;
}
C'est tout
Le meilleur moyen d'obtenir le nombre de lignes du jeu de résultats consiste à utiliser la requête count function pour accéder à la base de données, puis la méthode rs.getInt (1) pour obtenir le nombre de lignes . À partir de mon code:
String query = "SELECT COUNT() FROM table";
ResultSet rs = new DatabaseConnection().selectData(query);
rs.getInt(1);
cela retournera int valeur nombre de lignes extraites de la base de données . Ici, DatabaseConnection (). selectData () est mon code pour accéder à la base de données . J'ai également été bloqué ici mais résolu ensuite ...