Как получить количество строк с помощью ResultSet в Java? - PullRequest
64 голосов
/ 25 октября 2011

Я пытаюсь создать простой метод, который получает ResultSet в качестве параметра и возвращает int, который содержит количество строк ResultSet. Это правильный способ сделать это или не так много?

int size = 0;
    try {
        while(rs.next()){
            size++;
        }
    }
    catch(Exception ex) {
        System.out.println("------------------Tablerize.getRowCount-----------------");
        System.out.println("Cannot get resultSet row count: " + ex);
        System.out.println("--------------------------------------------------------");
    }

Я пробовал это:

int size = 0;
try {
    resultSet.last();
    size = resultSet.getRow();
    resultSet.beforeFirst();
}
catch(Exception ex) {
    return 0;
}
return size;

Но я получил сообщение об ошибке com.microsoft.sqlserver.jdbc.SQLServerException: The requested operation is not supported on forward only result sets.

Заранее спасибо за указатели!

Ответы [ 13 ]

0 голосов
/ 09 февраля 2016

Следующие две опции работали для меня:

1) Функция, которая возвращает количество строк в вашем ResultSet.

private int resultSetCount(ResultSet resultSet) throws SQLException{
    try{
        int i = 0;
        while (resultSet.next()) {
            i++;
        }
        return i;
    } catch (Exception e){
       System.out.println("Error getting row count");
       e.printStackTrace();
    }
    return 0;
}

2) Создайте второй оператор SQL с опцией COUNT.

0 голосов
/ 24 июля 2013

Вот некоторый код, который избегает получения счетчика для создания экземпляра массива, но вместо этого использует ArrayList и непосредственно перед возвратом преобразует ArrayList в нужный тип массива.

Обратите внимание, что класс Supervisor здесь реализует интерфейс ISupervisor, но в Java вы не можете приводить из объекта [] (который возвращает простой метод toArray () из ArrayList) в ISupervisor [] (как я думаю, вы можете сделать в C #) , поэтому вам нужно перебрать все элементы списка и заполнить массив результатов.

/**
 * Get Supervisors for given program id
 * @param connection
 * @param programId
 * @return ISupervisor[]
 * @throws SQLException
 */
public static ISupervisor[] getSupervisors(Connection connection, String programId)
  throws SQLException
{
  ArrayList supervisors = new ArrayList();

  PreparedStatement statement = connection.prepareStatement(SQL.GET_SUPERVISORS);
  try {
    statement.setString(SQL.GET_SUPERVISORS_PARAM_PROGRAMID, programId);
    ResultSet resultSet = statement.executeQuery();  

    if (resultSet != null) {
      while (resultSet.next()) {
        Supervisor s = new Supervisor();
        s.setId(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ID));
        s.setFirstName(resultSet.getString(SQL.GET_SUPERVISORS_RESULT_FIRSTNAME));
        s.setLastName(resultSet.getString(SQL.GET_SUPERVISORS_RESULT_LASTNAME));
        s.setAssignmentCount(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ASSIGNMENT_COUNT));
        s.setAssignment2Count(resultSet.getInt(SQL.GET_SUPERVISORS_RESULT_ASSIGNMENT2_COUNT));
        supervisors.add(s);
      }
      resultSet.close();
    }
  } finally {
    statement.close();
  }

  int count = supervisors.size();
  ISupervisor[] result = new ISupervisor[count];
  for (int i=0; i<count; i++)
    result[i] = (ISupervisor)supervisors.get(i);
  return result;
}
0 голосов
/ 31 января 2012

С http://docs.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSetMetaData.html

 ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
 ResultSetMetaData rsmd = rs.getMetaData();
 int numberOfColumns = rsmd.getColumnCount();

ResultSet содержит метаданные, которые дают количество строк.

...