0

请原谅我在正确命名这个问题时缺乏创造力。

嗨,我花了过去 3 个小时试图解决这个问题,我想我已经解决了,但它的解决方案仍然让我望而却步。我有这个非常简单的代码。

    Statement stmt = db.getStatement();
    ResultSet queryResult = stmt.executeQuery("SELECT * FROM users");

    while(queryResult.next()) {
        username = queryResult.getString("username");
        password = queryResult.getString("password");
        privilege = queryResult.getInt("privilege");

        queryResult = stmt.executeQuery("SELECT * FROM division");
        while(queryResult.next()) {}

        users.add(new User(username, password, privilege));
    }

现在,这段代码被简化以说明我的代码中的问题所在。显然,我没有一个什么都不包含的while循环。

我开始意识到,每当我想从数据库中获取一些东西时,我只能在一个循环中使用结果集。如果我写一个“嵌套结果集循环”,我会得到“操作...结果集关闭”、“找不到列'用户名'”或其他一些错误。

我的 DAO 代码中有很多这些嵌套的结果集循环,用于从数据库中获取所有内容。由于我在 MySQL 方面不是那么强,所以这是一个简单的解决方案(我只剩下很少的时间来做这个程序)......因为我曾经在 PHP 中做过类似的事情。

我并不是说这段代码是好的设计,但是因为时间的关系,我现在真的不太关心好的类设计。因此,无论设计选择如何,您想到的任何解决方案都受到欢迎。

另一种解决方案是将所有内容拆分为单个循环,因为这往往会起作用(非常简单)。但这意味着要修改很多代码,我希望这是备用计划。

4

2 回答 2

4

您不能像这样交错结果集,请参阅API 文档

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

如果您为不同的查询创建单独的语句,我认为您会没事的。我看到的通常做法是为每个查询使用单独的 DAO 方法,以使 DAO 方法尽可能简单和可重用。(这意味着 DAO 不负责事务划分,但更高级别的组件,如服务,控制事务中的内容。)

于 2012-12-15T21:21:33.407 回答
0

要解决您的问题 - 不要将嵌套循环的值分配给相同的 ResultSet

于 2012-12-15T21:21:44.680 回答