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
Почему это так?
Шаблон, который я обычно использую, выглядит так:
boolean empty = true;
while( rs.next() ) {
// ResultSet processing here
empty = false;
}
if( empty ) {
// Empty result set
}
Вот простой способ сделать это:
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
}
Почему выполнение не входит в while loop?
Если ваш ResultSet пуст, то метод rs.next()
возвращает false и тело цикла while не выполняется, независимо от того, что возвращается rownumber (не count) rs.getRow()
. Пример Колинса работает.
Перемещение курсора вперед и назад для определения количества строк не является обычной практикой 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.
while (results.next())
используется для итерации по набору результатов, поэтому results.next() вернет false, если он пуст.
Вы можете сделать и это:
rs.last();
int numberOfRows = rs.getRow();
if(numberOfRows) {
rs.beforeFirst();
while(rs.next()) {
...
}
}