ResultSet过早关闭

时间:2009-11-19 00:23:56

标签: java sql jdbc

我正在从正在运行的MYSQL数据库中编译一个Page变量列表(其中包含一个书籍列表)。在while(rs.next())循环中尝试第二次迭代时,我收到一个SQL异常,说明ResultSet已经关闭。我看不到这段代码关闭了rs对象。

try {
    stmt = con.createStatement();
    ResultSet rs =
            stmt.executeQuery("SELECT pageURL," +
                    "pageName FROM pages GROUP BY pageName;");
    ResultSet rs2;
    while(rs.next()) { // Where the error occurs on the second pass
        Page tempP = new Page(rs.getString(1),rs.getString(2));
        rs2 = stmt.executeQuery("SELECT `books`.`itemID`,cost," +
                "title,author,shortD,longD FROM " +
                "books INNER JOIN pages ON " +
                "books.itemID=pages.itemID WHERE " +
                "pageName='" + rs.getString(2) + "';");
        while(rs2.next()) {
            tempP.addBook(new Book(rs2.getInt(1),
                    rs2.getFloat(2),rs2.getString(3),
                    rs2.getString(4),rs2.getString(5),
                    rs2.getString(6)));
        }
        pages.addPage(tempP);
    }
} catch(SQLException e) {
    System.err.print("SQLException: ");
    System.err.println(e.getMessage());
}

以下是页面表的内容:

|pageName  |pageURL    |itemID|
-------------------------------
|Tech Books|./techbooks|1     |
-------------------------------
|Tech Books|./techbooks|2     |
-------------------------------
|Kids Books|./kidsbooks|3     |
-------------------------------
|Kids Books|./kidsbooks|4     |
-------------------------------
|Kids Books|./kidsbooks|5     |
-------------------------------

编辑:

好的,当我再次使用Statement时,看起来ResultSet变得无效。有没有人有任何建议来纠正这种情况?

2 个答案:

答案 0 :(得分:4)

引用Statement的javadoc:

  

默认情况下,每个Statement对象只能同时打开一个ResultSet对象。因此,如果读取一个ResultSet对象与另一个ResultSet对象的读取交错,则每个ResultSet对象必须由不同的Statement对象生成。如果存在一个开放的对象,则Statement接口中的所有执行方法都会隐式关闭该语句的当前ResultSet对象。

创建两个语句,或者更好地使用带有绑定变量的PreparedStatements。

答案 1 :(得分:0)

请参阅ResultSet的文档:

  

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