You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-user@db.apache.org by Francesco Rosa <in...@francescorosa.net> on 2007/10/27 11:52:03 UTC

Error: Invalid cursor state - no current row

Hello,
i have the database with two tables Opzioni, Preventivi.

This is my code;

public class DerbySample {
  
   public static void main(String args[]) {
      // esempio collegamento a derby con modifiche
      try {
         
Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
         String connectionString = 
"jdbc:derby:/Users/harlock/Documents/soft/EsempiJava_15/dati;create=false";
         Connection con = DriverManager.getConnection(connectionString, 
"", "");
         String sql = "select * from preventivi where prvID = 1";
         ResultSet rsPreventivi = 
con.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_UPDATABLE).executeQuery(sql);
         rsPreventivi.next();
         sql = "select * from opzioni";
         //----
         ResultSet rsOpzioni = 
con.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY).executeQuery(sql);
         while (rsOpzioni.next()) {
            System.out.println(rsOpzioni.getString("opzUtente"));
         }
         rsOpzioni.close();
         //----
         rsPreventivi.updateString("prvUtente", "fran");
         rsPreventivi.updateRow();
         rsPreventivi.close();
         System.out.println("bye bye");
      } catch (Exception ex) {
         System.out.println(ex.toString());
      }

   }
}

Run my sample program i receive the error: Invalid cursor state - no 
current row.
If comment the line;
         ResultSet rsOpzioni = 
con.createStatement(ResultSet.TYPE_FORWARD_ONLY, 
ResultSet.CONCUR_READ_ONLY).executeQuery(sql);
         while (rsOpzioni.next()) {
            System.out.println(rsOpzioni.getString("opzUtente"));
         }
         rsOpzioni.close();

my program work correctly!!!

Why? I don't understand!!!
thans.

Re: Error: Invalid cursor state - no current row

Posted by Knut Anders Hatlen <Kn...@Sun.COM>.
Francesco Rosa <in...@francescorosa.net> writes:

> Hello,
> i have the database with two tables Opzioni, Preventivi.
>
> This is my code;
>
> public class DerbySample {
>  public static void main(String args[]) {
>      // esempio collegamento a derby con modifiche
>      try {
>         Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
>         String connectionString =
> "jdbc:derby:/Users/harlock/Documents/soft/EsempiJava_15/dati;create=false";
>         Connection con = DriverManager.getConnection(connectionString,
> "", "");
>         String sql = "select * from preventivi where prvID = 1";
>         ResultSet rsPreventivi =
> con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
> ResultSet.CONCUR_UPDATABLE).executeQuery(sql);
>         rsPreventivi.next();
>         sql = "select * from opzioni";
>         //----
>         ResultSet rsOpzioni =
> con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
> ResultSet.CONCUR_READ_ONLY).executeQuery(sql);
>         while (rsOpzioni.next()) {
>            System.out.println(rsOpzioni.getString("opzUtente"));
>         }
>         rsOpzioni.close();
>         //----
>         rsPreventivi.updateString("prvUtente", "fran");
>         rsPreventivi.updateRow();
>         rsPreventivi.close();
>         System.out.println("bye bye");
>      } catch (Exception ex) {
>         System.out.println(ex.toString());
>      }
>
>   }
> }
>
> Run my sample program i receive the error: Invalid cursor state - no
> current row.
> If comment the line;
>         ResultSet rsOpzioni =
> con.createStatement(ResultSet.TYPE_FORWARD_ONLY,
> ResultSet.CONCUR_READ_ONLY).executeQuery(sql);
>         while (rsOpzioni.next()) {
>            System.out.println(rsOpzioni.getString("opzUtente"));
>         }
>         rsOpzioni.close();
>
> my program work correctly!!!
>
> Why? I don't understand!!!

Since you are running with auto-commit turned on, rsOpzioni.close() will
commit the open transaction, which means that all locks are released and
rsPreventivi will lose its position. You have a number of options:

  1) turn off auto-commit (con.setAutoCommit(false)) and perform commit
  explicitly (con.commit())

  2) reposition rsPreventivi after rsOpzioni has been closed

  3) perform rsPreventivi.updateString()+updateRow() before
  rsOpzioni.close()

HTH,
-- 
Knut Anders