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));}
答案 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)。这将自动抛出你在第二种情况下得到的异常。