db-derby-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Kristian Waagan <Kristian.Waa...@Sun.COM>
Subject Re: Resetting ResultSet with first() or beforeFirst()
Date Thu, 10 Jun 2010 08:59:52 GMT
On 09.06.10 19:32, Pavel Bortnovskiy wrote:
>
> Hi:
>
> I am trying to reset a given ResultSet back to the first record, so that
> I could iterate through its records one more time, after it's already
> been done once. So, my code does something like this (it's pseudo-code,
> and in the real application these two passes are done in different parts
> of the application):
>
> // get ResultSet
> final ResultSet resultSet = ((PreparedStatement)
> m_statement).executeQuery();
> final int columnCount = resultSet.getMetaData().getColumnCount();
> // First Pass through the data
> while (resultSet.next()) {
> for (int i = 1; i <= columnCount; i++) {
> if (resultSet.wasNull()) {

Hi,

I don't know of this issue is present in your actual code, but note that 
ResultSet.wasNull must be called *after* a getter method has been called.
 From the JavaDocs:

"Reports whether the last column read had a value of SQL NULL. Note that 
you must first call one of the getter methods on a column to try to read 
its value and then call the method wasNull to see if the value read was 
SQL NULL."

> doSomethingWithNULL();
> } else {
> doSomethingWithObject(resultSet.getObject(i));

Assuming wasNull was called after the getter method, the second 
getObject above may raise an exception in Derby. The restriction that 
you can call a getter only once for a given column is limited to some 
data types (i.e. BLOB and CLOB) and some getters (getXXXStream, 
getObject for the data types mentioned).

Just thought I'd mention it :)


Regards,
-- 
Kristian

> }
> }
> }
> // Reset ResultSet - but it generates SQLException: The 'beforeFirst()'
> method is only allowed on scroll cursors
> resultSet.beforeFirst();
> // Second Pass through the data
> while (resultSet.next()) {
> for (int i = 1; i <= columnCount; i++) {
> if (resultSet.wasNull()) {
> doSomethingElseWithNULL();
> } else {
> doSomethingElseWithObject(resultSet.getObject(i));
> }
> }
> }
>
>
> However, resultSet.beforeFirst() generates an exception:
>
> java.sql.SQLException: The 'beforeFirst()' method is only allowed on
> scroll cursors.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown
> Source)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
> at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source)
> at org.apache.derby.impl.jdbc.EmbedResultSet.checkScrollCursor(Unknown
> Source)
> at org.apache.derby.impl.jdbc.EmbedResultSet.beforeFirst(Unknown Source)
> Caused by: java.sql.SQLException: The 'beforeFirst()' method is only
> allowed on scroll cursors.
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown
> Source)
> at
> org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown
> Source)
> ... 8 more
>
> Could someone please help me out to understand what may be done
> incorrectly and what would be the right approach to enable two-pass
> logic through the RecordSet?
>
> Thanks,
>
> Pavel.
>
>
>
> Jefferies archives and monitors outgoing and incoming e-mail. The
> contents of this email, including any attachments, are confidential to
> the ordinary user of the email address to which it was addressed. If you
> are not the addressee of this email you may not copy, forward, disclose
> or otherwise use it or any part of it in any form whatsoever. This email
> may be produced at the request of regulators or in connection with civil
> litigation. Jefferies accepts no liability for any errors or omissions
> arising as a result of transmission. Use by other than intended
> recipients is prohibited. In the United Kingdom, Jefferies operates as
> Jefferies International Limited; registered in England: no. 1978621;
> registered office: Vintners Place, 68 Upper Thames Street, London EC4V
> 3BJ. Jefferies International Limited is authorised and regulated by the
> Financial Services Authority.


Mime
View raw message