2010-09-16 79 views
3

我连接到DB2数据库并进行以下查询。我不明白为什么我会收到错误:“无效光标状态”。SQLSTATE 24000 - 无效的光标状态

public static void blivPar() { 
      try { 
       Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
        ResultSet.CONCUR_UPDATABLE); 
       stmt.setMaxRows(1000); 

       ResultSet drenge = stmt.executeQuery("SELECT * FROM People WHERE sex='M'"); 
       ResultSet piger = stmt.executeQuery("SELECT * FROM People WHERE sex='F'"); 
       drenge.first(); 
       piger.first(); 
       int i=0; 
       while(drenge.next()) { 
        while(piger.next()) { 
         i++; 
         System.out.print(i); 
         stmt.execute("INSERT INTO Couples Values ('"+drenge.getString(1) + 
           "','" + drenge.getString(2) + 
           "','" + piger.getString(1) + 
           "','" + piger.getString(2) + "')"); 
        } 
       } 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 

     } 

谢谢。

+0

为什么你在使用SQL执行此操作时会在游标中执行此操作? – 2010-09-16 15:01:43

+0

你的堆栈跟踪是什么?什么是DB2引发的SQL代码? – 2010-09-16 15:09:09

回答

6

发现这对JDBC的Javadoc文档Statement接口:“用于执行静态SQL语句并返回它所生成结果的对象

默认情况下,每个Statement对象只有一个ResultSet对象可以是开放的因此,如果一个ResultSet对象的读取与另一个ResultSet对象的读取交错,则每个Result必须由不同的Statement对象生成。如果打开一个Statement对象,则Statement接口中的所有执行方法隐式关闭一个Statment的当前ResultSet对象一个存在“ 见Statement javadoc

因此,如果您希望在同一时间打开两个ResultSet,它就像我需要两种不同的语句。或者您需要完成处理您的第一个ResultSet并关闭它,以便您可以重新使用Statement来创建第二个ResultSet。

相关问题