繁体   English   中英

相对结果集跳过Java / Access中的最后一条记录

[英]Resultset relative skips last record in Java/Access

我的数据库:

+---------+-----------+---------------+-------------------+---------------+-----------------+--------------------+
| 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)为什么rs.relative(1)同样的工作。

API文档明确指出:

注意:调用方法relative(1)与调用方法next()相同,并且调用方法relative(-1)与调用方法previous()相同。

因此,我认为应该没有任何区别。 尝试对其进行调试,或者仅在调用relative(1)来检查您所在的行之前,在System.out.println中添加getRow()值。

编辑:查看您的代码我无法弄清楚为什么会失败,但要注意其余的方法不应该调用ShowMenu:您正在堆栈中链接调用。很难手动生成它,但是可以进行足够的用户交互使应用程序崩溃。 更好的方法是在showMenu()中循环,当用户按下5时会中断循环。

解决方案 :没错,问题是ResultSet的mySQL实现。 检查 API文档,其中mySQL代码如我们期望的那样显示“完全相反”(驱动程序的当前版本将此类重命名为com.mysql.jdbc.ResultSetImpl,但注释仍然存在):

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM