JDBC异常:ResultSet关闭后不允许操作

时间:2012-02-15 10:27:20

标签: java sql exception jdbc

  

可能重复:
  Getting java.sql.SQLException: Operation not allowed after ResultSet closed

我正在处理一些抛出Operation not allowed after ResultSet closed例外的代码。这是:

ResultSet res = stmt.executeQuery("SELECT codigo FROM projecto WHERE nome='"
    + auxiliarNomes.elementAt(i).toString() + "'");
while (res.next()) {
    codigo = res.getString("codigo");
    stmt.executeUpdate("insert into categoriaprojectos values("
        + "'" + codigo + "'" + "," + "'" + Antena.RetornaCodigoProjecto() + "')");
}

我做错了什么?

3 个答案:

答案 0 :(得分:6)

看起来像是Getting java.sql.SQLException: Operation not allowed after ResultSet closed的副本。简而言之,您无法对某些ResultSet的{​​{1}}进行迭代,并同时对同一Statement执行更新。

答案 1 :(得分:6)

这是可能的。只需使用额外的连接和声明。

Statement statementOne = connectionOne.createStatement();
Statement statementTwo = connectionTwo.createStatement();
ResultSet resultSetOne = statementOne.executeQuery("select * from x");

while (resultSetOne.next()) {
    ResultSet resultSetTwo = statementTwo.executeQuery(String.format("select * from y where xy = %s", resultSetOne.getString(0)));

    while (resultSetTwo.next()) {
        String result = resultSetTwo.getString(0);
    }
}

答案 2 :(得分:3)

您的代码非常脏写,您应该将PreparedStatementsparametrized SQL statements一起使用,因为如果没有它们,则存在 SQL注入的巨大危险。这种方法更快,更清洁,更安全! 阅读this

对于您的代码,尝试这样做,您应该使用batch来插入多个操作。

String SEL_QUERY = "SELECT codigo FROM projecto WHERE nome= ?";
String UPDATE_QUERY = "INSERT INTO categoriaprojectos values(?)";

PreparedStatement ps,ps1 = null;
ResultSet rs = null;

ps = con.prepareStatement(SEL_QUERY);
ps.setYourType(<data>);
rs =stmt.executeQuery();
ps1 = con.prepareStatement(UPDATE_QUERY );
while(rs.next())
{
   ps1.setYourType(rs.getType());
   ps1.addBatch();
}
ps1.executeBatch();

您应该使用批处理。它更快,更安全,更清洁。 addBatch()方法将一组参数添加到PreparedStatement对象的一批命令中。 例如,您将批量执行4次插入,然后您将执行它们质量。此技术被命名为数据集群