Как узнать, пуст ли полученный Java ResultSet?

Class.forName("org.sqlite.JDBC");
Connection conn =
    DriverManager.getConnection("jdbc:sqlite:userdata.db");
Statement stat = conn.createStatement();

ResultSet rs = stat.executeQuery("SELECT * from table WHERE is_query_processed = 0;");

int rowcount = rs.getRow(); 
System.out.println("Row count = "+rowcount); // output 1

rs.first(); // This statement generates an exception

Почему это так?

12
задан jasonmp85 30 May 2010 в 14:32
поделиться

6 ответов

Шаблон, который я обычно использую, выглядит так:

boolean empty = true;
while( rs.next() ) {
    // ResultSet processing here
    empty = false;
}

if( empty ) {
    // Empty result set
}
20
ответ дан 2 December 2019 в 04:42
поделиться

Вот простой способ сделать это:

public static boolean isResultSetEmpty(ResultSet resultSet) {
    return !resultSet.first();
}

Предостережения

Перемещает курсор в начало. Но если вы просто хотите проверить, пуст ли он, вы, вероятно, все равно ничего с ним не сделали.

В качестве альтернативы

Используйте метод first () непосредственно перед выполнением какой-либо обработки. ResultSet rs = stat.executeQuery ("SELECT * from table WHERE is_query_processed = 0;");

if(rs.first()) {
    // there's stuff to do
} else {
    // rs was empty
}

Ссылки

ResultSet (Java Platform SE 6)

5
ответ дан 2 December 2019 в 04:42
поделиться

Почему выполнение не входит в while loop?

Если ваш ResultSet пуст, то метод rs.next() возвращает false и тело цикла while не выполняется, независимо от того, что возвращается rownumber (не count) rs.getRow(). Пример Колинса работает.

1
ответ дан 2 December 2019 в 04:42
поделиться

Перемещение курсора вперед и назад для определения количества строк не является обычной практикой JDBC. Обычная практика JDBC - отобразить ResultSet в List объектов значений, каждый из которых представляет сущность строки таблицы, а затем просто использовать методы List , чтобы определить, есть ли там любые строки.

Например:

List<User> users = userDAO.list();

if (users.isEmpty()) {
    // It is empty!
if (users.size() == 1) {
    // It has only one row!
} else {
    // It has more than one row!
}

где метод list () выглядит следующим образом:

public List<User> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<User> users = new ArrayList<User>();

    try {
        connection = database.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(SQL_LIST);
        while (resultSet.next()) {
            User user = new User();
            user.setId(resultSet.getLong("id"));
            user.setName(resultSet.getString("name"));
            // ...
            users.add(user);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return users;
}

Также см. этот ответ для других примеров JDBC.

1
ответ дан 2 December 2019 в 04:42
поделиться
 while (results.next())

используется для итерации по набору результатов, поэтому results.next() вернет false, если он пуст.

1
ответ дан 2 December 2019 в 04:42
поделиться

Вы можете сделать и это:

rs.last();
int numberOfRows = rs.getRow();
if(numberOfRows) {
    rs.beforeFirst();
    while(rs.next()) {
        ...
    }
}
3
ответ дан 2 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: