我想从我的数据库" Logs "中选择最大行号并将其存储在变量中m.
这是我的代码:
ResultSet rs = stmt.executeQuery("Select max(Line) as L from logs");
while (rs.next()) { // Why do I need this
int m = rs.getInt("L");
System.out.println(m);
}
Run Code Online (Sandbox Code Playgroud)
但除非我使用,否则它不起作用while(rs.next()).
如果我理解正确,rs.next()将光标移动到下一行,但在这里,在这个结果中,我只有一行.
那么,有人可以解释为什么循环是必要的吗?我唯一能想到的是第一个光标是在列名上设置的,我是对的吗?
Zab*_*uza 76
光标最初放在第一个元素之前.您需要前进一次才能访问第一个元素.
这显然是因为使用循环遍历结果非常方便,如您所见.从官方文档:
将光标从当前位置向前移动一行.甲
ResultSet光标最初位于第一行之前 ; 对方法的第一次调用使得第一行成为当前行; 第二个调用使第二行成为当前行,依此类推.
因此,虽然您不需要任何循环,但您需要将光标前进一次.单从rs.next();技术上就足够了:
rs.next();
// Access the result
Run Code Online (Sandbox Code Playgroud)
但是,您可能想要考虑根本没有匹配的情况,因为:
当对
next方法的调用返回时false,光标位于最后一行之后.任何ResultSet需要当前行的方法的调用都将导致SQLException抛出.
所以在这种情况下代码会失败.
因此,您应该考虑案例并使用返回boolean来保护您的访问权限:
if (rs.next()) {
// Access result ...
} else {
// No match ...
}
Run Code Online (Sandbox Code Playgroud)
Eug*_*ene 22
从官方文档(你应该阅读btw):
最初,光标位于第一行之前.下一个方法将光标移动到下一行,因为当ResultSet对象中没有更多行时它返回false,它可以在while循环中用于迭代结果集.
你基本上需要移动它,在你的情况下移动它就足够了:
rs.next();
System.out.println(rs.getInt("L"));
Run Code Online (Sandbox Code Playgroud)
Mak*_*oto 11
您可以将其转换为使用简单的if语句.
if(rs.next()) {
// other code here
}
Run Code Online (Sandbox Code Playgroud)
while当你有多行时可以使用.
ResultSet游标最初位于第一行之前,第一次调用方法next使第一行成为当前行,第二次调用使第二行成为当前行,依此类推.
认为你有类似的东西.
->1->2->3
^
Run Code Online (Sandbox Code Playgroud)
你的"rs"最初指向1之前,当你调用rs.next()时它会使箭头指向1
->1->2->3
^
Run Code Online (Sandbox Code Playgroud)
因此,如果您不调用next()方法,则不会得到结果.
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
4472 次 |
| 最近记录: |