2010-09-16 208 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。

相關問題