【问题标题】:Resultset relative skips last record in Java/Access结果集相对跳过 Java/Access 中的最后一条记录
【发布时间】:2014-07-14 22:20:28
【问题描述】:

我的数据库:

+---------+-----------+---------------+-------------------+---------------+-----------------+--------------------+
| 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) 在第四条记录 ("Peeters Piet") 上返回 false,而还剩下一条记录 ("Vreemans Veerle"),因此它返回到第一条记录。

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

我知道我可以这样做

if (!rs.next()) {
     rs.first(); 
} 

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

【问题讨论】:

  • 您的查询是否有任何 WHERE 条件?
  • @PabloLozano 否,并且使用 rs.next() 返回正确的记录,所以我认为这不是我的查询。

标签: java mysql resultset


【解决方案1】:

API 文档明确表示:

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

所以我认为这应该没有什么区别。尝试调试它,或者在调用 relative(1) 之前在 System.out.println 中添加 getRow() 值以检查您所在的行。

编辑:查看您的 code 我无法弄清楚为什么会失败,但请注意 ShowMenu 不应被其余方法调用:您正在堆栈中链接调用。手动生成它非常困难,但是足够多的用户交互可能会使应用程序崩溃。一个更好的方法是在 showMenu() 中有一个循环,当用户按下 5 时它会被破坏。

解决方案:你说得对,问题在于 ResultSet 的 mySQL 实现。检查this API doc,其中 mySQL 代码如我们预期的那样完全相反(当前版本的驱动程序将此类重命名为 com.mysql.jdbc.ResultSetImpl,但注释仍然存在):

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

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

【讨论】:

  • pastebin.com/eksA2bV3 ,我在顶部有一些翻译,这是我的全部代码,它显示一个 printStream 菜单,选择一个操作,然后再次显示 printstream 菜单(循环排序)跨度>
  • 另外,你找到的api可能是针对 javax.xml.xquery 的,而不是针对 java.sql.ResultSet 的;编辑:我的错误,api确实这么说
  • 谢谢,老实说,这更像是 java 错误/api 错误,而不是我的代码中的错误
  • 我们可以尝试检查那部分:ResultSet 是一个接口。检查 ResultSet 的真实类是什么,也许可以检查它的代码(如果它是开源实现)
  • 检查,更新答案:错误是 java.sql.ResultSet 的 mySQL 实现
猜你喜欢
  • 1970-01-01
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多