Comment puis-je avoir la taille d'un java?SQL.ResultSet?
ne devrait-ce pas être une opération assez simple? Cependant, je vois qu'il n'y a pas de méthode size()
ou length()
.
15 réponses
resultSet.last()
suivi de resultSet.getRow()
vous donnera le nombre de lignes, mais il peut ne pas être une bonne idée car il peut signifier la lecture de la table entière sur le réseau et jeter les données. Faites une requête SELECT COUNT(*) FROM ...
à la place.
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
}
eh Bien, si vous avez un ResultSet
de type ResultSet.TYPE_FORWARD_ONLY
vous voulez le garder de cette façon (et pas pour passer à une ResultSet.TYPE_SCROLL_INSENSITIVE
ou ResultSet.TYPE_SCROLL_INSENSITIVE
afin d'être en mesure d'utiliser .last()
).
je suggère un hack très agréable et efficace, où vous ajoutez une première ligne fausse/fausse au sommet contenant le nombre de lignes.
exemple
disons que votre requête est la après
select MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHAR
from MYTABLE
where ...blahblah...
et votre sortie ressemble à
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]
reformulez simplement votre code à quelque chose comme ceci:
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);
votre requête sera maintenant quelque chose comme
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]
donc il suffit de
if(rs.next())
System.out.println("Recordcount: "+rs.getInt("RECORDCOUNT"));//hack: first record contains the record count
while(rs.next())
//do your stuff
j'ai eu une exception en utilisant rs.last()
if(rs.last()){
rowCount = rs.getRow();
rs.beforeFirst();
}
:
java.sql.SQLException: Invalid operation for forward only resultset
il est dû à par défaut il est ResultSet.TYPE_FORWARD_ONLY
, ce qui signifie que vous ne pouvez utiliser rs.next()
la solution est:
stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
c'est un moyen simple de faire des lignes-Compter.
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
La façon d'obtenir la taille d'un jeu de résultats, Pas besoin de l'aide de liste de tableaux etc
int size =0;
if (rs != null)
{
rs.beforeFirst();
rs.last();
size = rs.getRow();
}
Maintenant, vous obtiendrez la taille, et si vous voulez imprimer le jeu de résultats, avant d'imprimer utiliser la ligne de code trop,
rs.beforeFirst();
[prise en compte de la vitesse]
Lot de ppl ici suggère ResultSet.last()
mais pour cela, vous auriez besoin d'ouvrir la connexion comme un ResultSet.TYPE_SCROLL_INSENSITIVE
qui, pour Derby embedded database est jusqu'à 10 fois plus lent que ResultSet.TYPE_FORWARD_ONLY
.
selon mes micro-tests pour les bases de données embedded Derby et H2, il est beaucoup plus rapide d'appeler SELECT COUNT(*)
avant votre SELECT.
j'ai vérifié la valeur d'exécution de l'interface ResultSet et j'ai découvert que c'était à peu près un Resultetimpl tout le temps. Resultetimpl a une méthode appelée getUpdateCount()
qui renvoie la valeur que vous recherchez.
cet échantillon de code devrait suffire:
ResultSet resultSet = executeQuery(sqlQuery);
double rowCount = ((ResultSetImpl)resultSet).getUpdateCount()
je me rends compte que passer est généralement une procédure dangereuse, mais cette méthode n'a pas encore échoué moi.
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);
}
Aujourd'hui, j'ai utilisé cette logique pourquoi je ne sais pas obtenir le compte de 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.
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();
j'avais le même problème. En utilisant ResultSet.first()
de cette façon juste après l'exécution résolu:
if(rs.first()){
// Do your job
} else {
// No rows take some actions
}
Documentation ( lien ):
boolean first() throws SQLException
déplace le curseur à la première ligne de cet objet
ResultSet
.Retourne:
true
si le curseur est sur une ligne;false
si il n'y a pas de lignes dans le jeu de résultatslancers:
SQLException
- si une erreur d'accès à la base de données se produit, cette méthode est appelée sur un jeu de résultats fermé ou le type de jeu de résultats estTYPE_FORWARD_ONLY
SQLFeatureNotSupportedException
- si le pilote JDBC ne supporte pas cette méthodePuisque:
1.2
donner un nom à la colonne..
String query = "SELECT COUNT(*) as count FROM
référencez cette colonne de L'objet ResultSet dans un int et faites votre logique à partir de là..
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.");
}
}
similaire à la méthode de Garret,
boolean isEmpty = true
while(rs.next()){
isEmpty = false;
//do stuff here
}
simple et sympathique, et nous n'avons pas d'potentiellement géant entier généré. Cela suppose naturellement que nous voulons itérer au-dessus de notre ensemble de résultats. Si nous ne voulons pas répéter sur elle, alors faire un compte devrait suffire.