2012-03-06 13 views
0

如果我刪除beforeFirst()我的功能只有第一個記錄在ResultSet並結束。如果我使用beforeFirst(),則會收到錯誤ResultSet IS_TYPE_FORWARD_ONLY爲什麼rs.next()不會去另一個記錄

try { 
    ResultSet rs = stat.executeQuery("select _id, godziny_id from tblZmiany where harmonogram_id = " + h_id + " order by pracownik_id, Dzien"); 
    rs.beforeFirst(); 
    while (rs.next()) { 
     if (stat.executeUpdate("insert into tblWykonanie (Zmiana_id, Godziny_id) values ('" + rs.getLong(1) + "', " + rs.getInt(2) + ");") < 1) { 
      // Jeśli insert nie wstawił kolejnego rekordu 
      error_code = "Wystąpił problem podczas zatwierdzania harmonogramu."; 
      return false; 
     } 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
    System.out.println(e.getMessage()); 
    return false; 
} catch (Exception e) { 
    error_code = e.getMessage(); 
    return false; 
} 

return true; 
+0

請哪種類型的SQL引擎的 – mKorbel 2012-03-06 18:37:39

+1

可能要重設RS在.executeUpdate? – Nadmin 2012-03-06 18:36:58

回答

3

您使用相同Statement對象爲SELECTINSERT兩者。從Javadoc

時生成它的Statement對象被關閉時,重新執行,或用於檢索從多個結果序列中的下一結果的ResultSet對象將自動關閉。

要解決此問題,請使用單獨的Statement對象來調用executeUpdate()

此外,我強烈建議您更改代碼以使用帶有綁定參數的PreparedStatement(由?表示)。像現在一樣,一點一點地構建SQL語句可能會打開security vulnerabilities

1

您的代碼有一個重大的安全漏洞。您很容易受到SQL注入的影響。從來沒有,永遠,永遠,永遠,永遠,使用SQL語句的字符串連接;改用PreparedStatements!

harmonogram_id = " + h_id + " order by pracownik_id, 

看看這裏,看看您的應用程序可以用簡單的技巧輕鬆擁有: http://en.wikipedia.org/wiki/SQL_injection

雖則回答你的問題,這取決於您的數據庫。你有連接創建過程中設置一個屬性:

Statement stmt = con.createStatement(
          ResultSet.TYPE_SCROLL_SENSITIVE, 
          ResultSet.CONCUR_UPDATABLE), 
          ResultSet.HOLD_CURSORS_OVER_COMMIT); 

來源: http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/resultset.html#1012735

+1

不是最佳實踐,但如果'h_id'是一個整數,則沒有風險。 – 2012-03-06 18:43:56

+0

同意,但我不同意。現在它可能是安全的,但如果你的新手同事出現並將int更改爲String,那麼他不必在前端做很多工作?單元測試仍然會「通過」。最好安全,不要抱歉! – 2012-03-06 18:48:15

相關問題