如果我删除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;
答案 0 :(得分:3)
您对Statement
和SELECT
使用相同的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