Использование Resultset в программе Java - PullRequest
8 голосов
/ 25 октября 2010
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 ]

12 голосов
/ 25 октября 2010

Вы должны переместить курсор набора результатов в строку - либо на resultSet.first(), либо на resultSet.next().Первоначально курсор указывает на первую строку, отсюда и ваше исключение.

Если вы хотите выполнить итерацию ResultSet:

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

Обновление: Для вашего второгопроблема - (как отметил Касабланка) ваш запрос, похоже, возвращает только один столбец, а вы запрашиваете 2-й и 3-й - и они не найдены.Обратите внимание, что в rs.getX(idx) idx это столбец, а не строка.

5 голосов
/ 25 октября 2010

Вам необходимо вызвать 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 голосов
/ 25 октября 2010

Вам необходимо использовать один из методов, чтобы переместить курсор 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
}
0 голосов
/ 24 сентября 2012

Насколько мне известно, ваш запрос получит только одну строку и столбец, т. Е. Общее количество строк, которые возвращает ваш запрос.

Скажем, например:

Выберите количество (*) от emp;Обычно этот запрос будет возвращать значение 14.

, поэтому ваш код Java

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

вернет только одно значение, т. Е. 14

Итак, как вы можете получить доступ к rs.GetString (2).Это автоматически сгенерирует исключение, которое вы получили во втором случае.

...