2010-10-25 20 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)。這會自動拋出你在第二種情況下得到的異常。