在Java程序中使用Resultset

LGA*_*GAP 8 java jdbc resultset

Resultset rs=stmt.executeQuery("select count(*) from feedsca group by score order by score");
Run Code Online (Sandbox Code Playgroud)

使用上面的上述java代码,我从名为feedsCA的表中检索行数.

虽然试图检索使用rs.getInt计数(1),rs.getInt(2),rs.getInt(3),I结束与一个错误如下说

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: The result set has no current row.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyResultSetHasCurrentRow(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getterGetColumn(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source)
    at SimpleMail.main(SimpleMail.java:151)
Run Code Online (Sandbox Code Playgroud)

更新:

上述例外已经解决.

但我得到以下异常,我不知道原因.请指教.

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: The index 2 is out of range.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.verifyValidColumnIndex(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getterGetColumn(Unknown Source)
    at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getInt(Unknown Source)
    at SimpleMail.main(SimpleMail.java:152)
Run Code Online (Sandbox Code Playgroud)

这就是我更新程序的方式.找到一个合乎逻辑的方法,因为我可以理解,下面的循环将无法按要求工作.

rs=stmt.executeQuery("select count(*) from feedsca group by score order by score");
while(rs.next()){
pw.printf(rowFormat, rs.getLong(1),"0",rs.getLong(2),rs.getLong(3));}
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 12

您必须将结果集的光标移动到一行 - by resultSet.first()或by resultSet.next().最初光标指向第一行之前,因此您的异常.

当你想迭代ResultSet:

while(rs.next()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

更新:对于你的第二个问题 - (正如卡萨布兰卡所说)你的查询似乎只返回一列,你要求的是第二和第三 - 而且找不到它们.请注意,in rs.getX(idx) idx是列,而不是行.

  • @LGAP:您的查询是`SELECT COUNT(*)...`,它只返回1个值.因此唯一有效的索引是1,这就是它抱怨索引2超出范围的原因. (3认同)

cas*_*nca 5

您需要rs.next()在访问第一行之前调用.

通常,您将迭代结果集,如下所示:

ResultSet rs = ...;
while (rs.next()) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

更新:请注意,SELECT COUNT(*) ...每行只返回一个字段,即计数.您可能有多行,但每行只有一个字段,其中包含索引1.您需要遍历行以获取所有计数:

while (rs.next()) {
  System.out.println(rs.getInt(1));
}
Run Code Online (Sandbox Code Playgroud)

还有一个更新:假设您的查询总是只返回3行是不好的.但是,如果你完全确定这一点,那么你可以next手动调用3次:

long l1, l2, l3;
rs.next();
l1 = rs.getLong(1);
rs.next();
l2 = rs.getLong(1);
rs.next();
l3 = rs.getLong(1);
pw.printf(rowFormat, l1,"0",l2,l3);
Run Code Online (Sandbox Code Playgroud)