Hello

I use todays JDBC-Driver (Implementation-Version: 7.4.4, Build
003-000-157-173) and found a bug (I think it is one) when trying to
detect the number of rows by calling the two methods

      boolean last = rs.last();
      count = rs.getRow();

last: false (this is not incorrect), but
count: should be >500 in my case, but is 0.

While this usually works perfect, it does not for the exactly same
sql-query/statement. It seems to depend on a state but I have no idea on
which one. To be sure that the resultset really contains all the rows
(several hundreds) I first called rs.next() three times and checked the
resultset (rs.getString(1) returnd the correct values for the first
three rows for example).

While it is correct that last() returns false, rs.getRow() should return
a number > 500 in my case (this usually happens but in rare cases not).

Here are some other values returned by the ResultSet-Object used:

rs.isBeforeFirst(): false
rs.isFirst(): false
rs.getRow(): 3 // we are on the third row (of many rows), that's
correct.
rs.last(): false // is NOT incorrect
rs.getType(): 1005 //default
rs.getRow(): 0  // HERE IS THE PROBLEM
rs.last(): false // repeated call returns the same values.
rs.getRow(): 0  // HERE IS THE PROBLEM


I guess it was best to add some debugging code into ResultSetSapDB.java
to find out which of all the cases that are considered within the
implementation of the methods last() and getRow() causes that behaviour.
If necessary, we'll do that.

Thanks for any comment.

G. Matter
Invoca Systems

"Schroeder, Alexander" schrieb:
> 
> Hi,
> 
> > Hi,
> >
> > how can i get the number of rows returned by
> >    PreparedStatement s = "...";
> >    ResultSet r = s.executeQuery();
> >
> > I currently use
> >    int count;
> >    if (r.isAfterLast())
> >      count = 0;
> 
> This is wrong, as JDBC says for isAfterLast:
> 
>    Returns true if the cursor is after the last row; false
>    if the cursor is at any other position or the result set contains
>    no rows.
> 
> Also, if there are no rows, getRow() returns 0 immediately, and calling 'last' does
> not harm.
> 
> >    else
> >    {
> >      r.last();
> >      count = r.getRow();
> >    }
> >
> > My hope is, that last() instructs the kernel to move the
> > cursor to the
> > last row, and therefor the traffic won't be that much.
> 
> Yes, but *only* this. Actually calling 'getRow' while being
> on the 'last' row uses some tricks, which may or may not
> be performant enough. Its performance depends heavily on
> the particular strategy chosen by the database to create
> the result, and what you have done on the result before.
> (Fetching through the result, and afterwards using that
> sequence above is quite more performant as doing it as
> first operation).
> 
> > Is there a more sapdb-optimized version to get the number of rows
> > returned by a select-statement?
> 
> No. If you look at other DBMS', you will see that getRow() is
> always relatively expensive.
> 
> If you want only the number, there is no need for selecting the
> data => use a "SELECT COUNT(...) ...",
> if you need to handle the data you have to live with the fact that
> DBMS usually only know the result count when they have built up
> the result completely.
> 
> Regards
> Alexander Schröder
> SAP Labs Berlin
> _______________________________________________
> sapdb.general mailing list
> [EMAIL PROTECTED]
> http://listserv.sap.com/mailman/listinfo/sapdb.general

-- 
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to