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

Как я могу узнать, что ResultSet, который я получил при запросе к базе данных, пуст или нет?


person Yatendra    schedule 25.02.2010    source источник


Ответы (6)


Сразу после оператора execute у вас может быть оператор if. Например

ResultSet rs = statement.execute();
if (!rs.next()){
//ResultSet is empty
}
person Paul    schedule 25.02.2010
comment
однако, если набор результатов не пуст, вы переместите курсор, фактически пропустив первую строку. - person monopoint; 04.12.2014
comment
@Paul Я считаю, что вам следует обновить свой ответ, чтобы завершить его, сбросив курсор непосредственно перед первой строкой в ​​блоке else, если он не пуст, т.е. else { rs.beforeFirst(); } - person sactiw; 15.06.2015

Определенно это дает хорошее решение,

ResultSet rs = stmt.execute("SQL QUERY");
// With the above statement you will not have a null ResultSet 'rs'.
// In case, if any exception occurs then next line of code won't execute.
// So, no problem if I won't check rs as null.

if (rs.next()) {
    do {
      // Logic to retrieve the data from the resultset.
      // eg: rs.getString("abc");
    } while(rs.next());
} else {
    // No data
}
person purush    schedule 06.12.2011

Сделайте это с помощью rs.next():

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

Если набор результатов пуст, код внутри цикла не будет выполняться.

person Scott Smith    schedule 25.02.2010

Если вы используете rs.next (), вы переместите курсор, чем вы должны переместить first (), почему бы не проверить, используя first () напрямую?

    public void fetchData(ResultSet res, JTable table) throws SQLException{     
    ResultSetMetaData metaData = res.getMetaData();
    int fieldsCount = metaData.getColumnCount();
    for (int i = 1; i <= fieldsCount; i++)
        ((DefaultTableModel) table.getModel()).addColumn(metaData.getColumnLabel(i));
    if (!res.first())
        JOptionPane.showMessageDialog(rootPane, "no data!");
    else
        do {
            Vector<Object> v = new Vector<Object>();
            for (int i = 1; i <= fieldsCount; i++)              
                v.addElement(res.getObject(i));         
            ((DefaultTableModel) table.getModel()).addRow(v);
        } while (res.next());
        res.close();
}
person Kachwahed    schedule 25.06.2011
comment
Я согласен. Я добавил свой код ниже (не смог включить код с комментарием). - person Santosh Tiwari; 01.07.2011

if (rs == null || !rs.first()) {
    //empty
} else {
    //not empty
}

Обратите внимание, что после вызова этого метода, если набор результатов не пуст, он находится в начале.

person Santosh Tiwari    schedule 01.07.2011
comment
«Так безопаснее», - подумал я. - person Kachwahed; 04.09.2011
comment
ResultSet никогда не может быть нулевым. - person red1ynx; 28.12.2011

Вычисляет размер java.sql.ResultSet:

int size = 0;
if (rs != null) {
    rs.beforeFirst();
    rs.last();
    size = rs.getRow();
}

(Источник)

person Dolph    schedule 25.02.2010
comment
Насколько я знаю, это плохая идея ... во-первых, вам нужно убедиться, что результат может двигаться в обратном направлении, во-вторых, вы получаете удар производительности при этом. Намного быстрее просто использовать набор результатов только вперед и использовать цикл while (как это уже было предложено здесь другими) - person user85116; 19.04.2010
comment
Согласен ... Я проголосовал за принятый ответ, который отвечает на вопрос гораздо более прямо. - person Dolph; 20.04.2010
comment
Дольф - ПРИЯТНО !!!!! - person Michael Sims; 19.11.2017