我的数据库:
+---------+-----------+---------------+-------------------+---------------+-----------------+--------------------+
| 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)
没有做同样的工作。
答案 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约定使代码对其他人更具可读性);)