为什么rs.next()不会转到另一条记录

时间:2012-03-06 18:33:40

标签: java sqlite resultset

如果我删除beforeFirst()我的功能只会首先记录在ResultSet并结束。如果我使用beforeFirst(),我会收到错误ResultSet IS_TYPE_FORWARD_ONLY

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;

2 个答案:

答案 0 :(得分:3)

您对StatementSELECT使用相同的INSERT对象。来自Javadoc

  

当生成它的ResultSet对象关闭,重新执行或用于从多个结果序列中检索下一个结果时,Statement对象会自动关闭。

要解决此问题,请为Statement电话使用单独的executeUpdate()对象。

另外,我强烈建议您更改代码以使用绑定参数PreparedStatement(由?表示)。正如你现在所做的那样,逐步构建SQL语句可能会打开security vulnerabilities

答案 1 :(得分: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