2010-10-25 57 views
8
Resultset rs=stmt.executeQuery("select count(*) from feedsca group by score order by score"); 

使用上面的java代码,检索名为feedsCA的表中的行数。在Java程序中使用结果集

虽然试图检索使用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) 

UPDATE :

上述例外已解决。

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

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

回答

12

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

当你要遍历ResultSet

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

更新:对于你的第二个问题 - (由卡萨布兰卡说明)查询,似乎只返回一个列,你所要求的第2个和第三 - 他们没有找到。请注意,在rs.getX(idx)idx是列,而不是行。

+0

感谢Bozho!请更新我最近的例外情况。查看我更新的问题 – LGAP 2010-10-25 16:34:04

+3

@LAPP:您的查询是'SELECT COUNT(*)...',它只返回1个值。因此唯一有效的索引是1,这就是为什么它抱怨索引2超出范围。 – casablanca 2010-10-25 16:35:24

+0

@casablanca&Bozho请发现我更新的问题... – LGAP 2010-10-25 16:40:41

2

在使用getxxx方法之前,您需要使用其中一种方法将ResultSet光标移动到一行。即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 
} 
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); 
+0

谢谢卡萨布兰卡!在这种情况下,我很确定查询只返回三行。我将为其他类似场景的查询寻找替代方法。 – LGAP 2010-10-25 17:02:54

0

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

说,例如:

SELECT COUNT(*)FROM EMP; 一般来说这个查询将返回一个值14

所以你的Java代码

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

将返回只有一个值,即14

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