Resultset relative跳过Java / Access中的最后一条记录

时间:2014-05-26 07:42:35

标签: java mysql resultset

我的数据库:

+---------+-----------+---------------+-------------------+---------------+-----------------+--------------------+
| KlantId | KlantNaam | KlantVoornaam | KlantAdres        | KlantPostcode | KlantWoonplaats | KlantGeboorteDatum |
+---------+-----------+---------------+-------------------+---------------+-----------------+--------------------+
|       1 | Vervoort  | Dieter        | Grootstraat 1     |          3500 | Hasselt         | 1/01/1991          |
|       2 | Droogmans | Jos           | Kleine Laan 2     |          3500 | Hasselt         | 5/05/1999          |
|       3 | Severijns | Sarah         | Brede Weg 3       |          3570 | Alken           | 28/02/1972         |
|       4 | Peeters   | Piet          | Rondplein 4       |          3600 | Genk            | 6/08/1973          |
|       5 | Vreemans  | Veerle        | Lange Boulevard 5 |          3500 | Hasselt         | 4/04/1980          |
+---------+-----------+---------------+-------------------+---------------+-----------------+--------------------+

我的代码在哪里读到:

try {

    System.out.println("De klanten zijn:");
    if (!rs.relative(1)) {
        rs.first(); 
    } 
    System.out.println("Naam en voornaam: " + rs.getString("KlantVoornaam") + " " + rs.getString("KlantNaam"));
    ShowMenu();

    con.close();
} catch (SQLException e) {
    System.out.println(e.getMessage());
    System.exit(0);
}

由于某些奇怪的原因,rs.relative(1)在第4条记录("Peeters Piet")上返回false,而剩下一条记录("Vreemans Veerle"),因此它返回第一条记录。

这是rs.relative()或我的代码中的错误吗?

我知道我可以用

做到这一点
if (!rs.next()) {
     rs.first(); 
} 

但我想知道为什么rs.relative(1)没有做同样的工作。

1 个答案:

答案 0 :(得分:1)

API文档明确表示:

  

注意:调用方法relative(1)与调用   方法next()和调用方法relative(-1)是相同的   调用方法previous()。

所以我认为它应该没有任何区别。尝试调试它,或者只是在System.out.println中添加getRow()值,然后再调用relative(1)来检查你是哪一行。

编辑:看你的code我无法弄清楚为什么会失败,但要注意ShowMenu不应该被其他方法调用:你在堆栈中串联调用。它非常难以手动生成,但足够的用户交互可能会导致应用程序崩溃。更好的方法是在showMenu()中使用一个循环,当用户按下5时,该循环将被破坏。

解决方案:你说得对,问题是ResultSet的mySQL实现。检查this API文档,其中mySQL代码完全按照我们的预期说明了对象(当前版本的驱动程序将此类重命名为com.mysql.jdbc.ResultSetImpl,但评论仍然存在):

  

注意:调用relative(1)与调用next()不同   在没有当前行时调用next()是有意义的,例如,   当光标位于第一行之前或之后   结果集的一行。

方法名称应以小写字母开头(遵循Java约定使代码对其他人更具可读性);)