在Java程序中使用Resultset

时间:2010-10-25 16:26:27

标签: java jdbc resultset

Resultset rs=stmt.executeQuery("select count(*) from feedsca group by score order by score");

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

尝试使用rs.getInt(1),rs.getInt(2),rs.getInt(3)检索计数时,我以下面的错误结束,

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)

更新

上述异常已经解决。

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

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)

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

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));}

4 个答案:

答案 0 :(得分:12)

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

如果要迭代ResultSet

while(rs.next()) {
    ...
}

更新:对于您的第二个问题 - (如Casablanca所述)您的查询似乎只返回一列,而您要求的是第二个和第三个 - 并且找不到它们。请注意,在rs.getX(idx) idx中是列,而不是行。

答案 1 :(得分:5)

在访问第一行之前,您需要致电rs.next()

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

ResultSet rs = ...;
while (rs.next()) {
  ...
}

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

while (rs.next()) {
  System.out.println(rs.getInt(1));
}

另一个更新:假设您的查询总是只返回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);

答案 2 :(得分:2)

在使用ResultSet方法之前,您需要使用其中一种方法将getxxx光标移动到一行。即rs.next()rs.first()rs.last()。如果找到了有效行,则这些方法返回true,因此典型模式为

if (rs.first()) {
  int field1 = rs.getInt(1); 
  // other columns
}

或返回多行的查询:

while (rs.next()) {
  int field1 = rs.getInt(1);
  // other columns
}

答案 3 :(得分:0)

据我所知,您的查询只会获得一行和一列,即查询返回的总行数。

比如说:

从emp中选择count(*); 通常,此查询将返回值14。

所以你的java代码

if(rs.next())
    rs.getInt(1); 

只返回一个值,即14

那么,如何访问rs.getString(2)。这将自动抛出你在第二种情况下得到的异常。