2010-10-25 2 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), я конец с ошибкой, говоря, как показано ниже,

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 и 3-й - и они не найдены. Обратите внимание, что в rs.getX(idx)idx находится столбец, а не строка.

+0

Thanks Bozho! Пожалуйста, обновите меня и в моем недавнем исключении. См. Мой обновленный вопрос – LGAP

+3

@LGAP: ваш запрос: 'SELECT COUNT (*) ...', который возвращает только 1 значение. Следовательно, единственным действительным индексом является 1, поэтому он жалуется, что индекс 2 выходит за пределы диапазона. – casablanca

+0

@casablanca & Bozho Пожалуйста, найдите мой обновленный вопрос ... – LGAP

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

Спасибо casablanca! В этом случае я уверен, что запрос вернет только три строки. Я поеду на альтернативный метод для любых других запросов с похожим сценарием. – LGAP

0

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

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

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

так код Java

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

будет возвращать только одно значение то есть, 14

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

Смежные вопросы