How do I get the size of a java.sql.ResultSet? How do I get the size of a java.sql.ResultSet? sql sql

How do I get the size of a java.sql.ResultSet?


Do a SELECT COUNT(*) FROM ... query instead.

OR

int size =0;if (rs != null) {  rs.last();    // moves cursor to the last row  size = rs.getRow(); // get row id }

In either of the case, you won't have to loop over the entire data.


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}


Well, if you have a ResultSet of type ResultSet.TYPE_FORWARD_ONLY you want to keep it that way (and not to switch to a ResultSet.TYPE_SCROLL_INSENSITIVE or ResultSet.TYPE_SCROLL_INSENSITIVE in order to be able to use .last()).

I suggest a very nice and efficient hack, where you add a first bogus/phony row at the top containing the number of rows.

Example

Let's say your query is the following

select MYBOOL,MYINT,MYCHAR,MYSMALLINT,MYVARCHARfrom MYTABLEwhere ...blahblah...

and your output looks like

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]

Simply refactor your code to something like this:

Statement s=myConnection.createStatement(ResultSet.TYPE_FORWARD_ONLY,                                         ResultSet.CONCUR_READ_ONLY);String from_where="FROM myTable WHERE ...blahblah... ";//h4xResultSet 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);

Your query output will now be something like

1000 null     null null    null nullnull 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]

So you just have to

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