Получить количество строк, возвращаемых ResultSet в Java

Я использовал ResultSet, который возвращает определенное количество строк. Мой код выглядит примерно так:

ResultSet res = getData();
if(!res.next())
{
    System.out.println("No Data Found");
}
while(res.next())
{
    // code to display the data in the table.
}

Есть ли способ проверить количество строк, возвращаемых ResultSet? Или мне нужно написать свой собственный?

Ответ 1

Вы можете использовать цикл do ... while вместо цикла while, так что после выполнения цикла вызывается rs.next(), например:

if (!rs.next()) {                            //if rs.next() returns false
                                             //then there are no rows.
    System.out.println("No records found");

}
else {
    do {
        // Get data from the current row and use it
    } while (rs.next());
}

Или считайте строки сами, когда вы их получите:

int count = 0;

while (rs.next()) {
    ++count;
    // Get data from the current row and use it
}

if (count == 0) {
    System.out.println("No records found");
}

Ответ 2

Во-первых, вы должны создать Statement, который может перемещать курсор по команде:

Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);

Затем извлеките ResultSet, как показано ниже:

ResultSet rs = stmt.executeQuery(...);

Переместите курсор на последнюю строку и получите его:

if (rs.last()) {
    int rows = rs.getRow();
    // Move to beginning
    rs.beforeFirst();
    ...
}

Затем переменная строк будет содержать количество строк, возвращаемых sql

Ответ 3

Простой метод getRowCount может выглядеть следующим образом:

private int getRowCount(ResultSet resultSet) {
    if (resultSet == null) {
        return 0;
    }
    try {
        resultSet.last();
        return resultSet.getRow();
    } catch (SQLException exp) {
        exp.printStackTrace();
    } finally {
        try {
            resultSet.beforeFirst();
        } catch (SQLException exp) {
            exp.printStackTrace();
        }
    }
    return 0;
}

Просто для того, чтобы знать, что для этого метода потребуется прокручиваемый чувствительный результирующий набор, при создании соединения вы должны указать опцию прокрутки. По умолчанию FORWARD, и использование этого метода вызовет исключение.

Ответ 4

Другой способ разграничения между 0 строками или несколькими строками из ResultSet:

ResultSet res = getData();

if(!res.isBeforeFirst()){          //res.isBeforeFirst() is true if the cursor
                                   //is before the first row.  If res contains
                                   //no rows, rs.isBeforeFirst() is false.

    System.out.println("0 rows");
}
else{
    while(res.next()){
        // code to display the rows in the table.
    }
}

Если вам нужно знать количество строк, заданных в ResultSet, вот способ его получения:

public int getRows(ResultSet res){
    int totalRows = 0;
    try {
        res.last();
        totalRows = res.getRow();
        res.beforeFirst();
    } 
    catch(Exception ex)  {
        return 0;
    }
    return totalRows ;    
}

Ответ 5

res.next() метод примет указатель на следующую строку. и в вашем коде вы используете его дважды, сначала для условия if (курсор перемещается в первую строку), затем для условия (курсор перемещается во вторую строку).

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

вы можете попробовать следующее:

if(!res.next()){ 
    System.out.println("No Data Found");  
}
else{
    do{
       //your code
    } 
    while(res.next());
}

Ответ 6

Вы можете посчитать с помощью sql и получить ответ из набора результатов следующим образом:

Statment stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
                                     ResultSet.CONCUR_READ_ONLY);
ResultSet ct = stmt.executeQuery("SELECT COUNT(*) FROM [table_name]");
if(ct.next()){
   td.setTotalNumRows(ct.getInt(1));
}

Здесь я считаю все, но вы можете легко изменить SQL для подсчета на основе критериев.

Ответ 7

        rs.last();
        int rows = rs.getRow();
        rs.beforeFirst();

Ответ 8

Вы можете загрузить ResultSet в TableModel, а затем создать JTable, который использует эту TableModel, а затем использовать метод table.getRowCount(). Если вы собираетесь отображать результат запроса, вы все равно должны это сделать.

ResultSet resultSet;
resultSet = doQuery(something, somethingelse);
KiransTableModel myTableModel = new KiransTableModel(resultSet);
JTable table = new JTable(KiransTableModel);
int rowCount;
rowCount = table.getRowCount;

Ответ 9

Statement st = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
ResultSet rs=st.executeQuery("select * from emp where deptno=31");
rs.last();
System.out.println("NoOfRows: "+rs.getRow());

первая строка кода говорит о том, что мы можем перемещаться в любом месте набора результатов (либо в первую строку, либо в последнюю строку или перед первой строкой без необходимости перемещаться по строке, начиная с первой строки, которая занимает время). Вторая строка кода извлекает записи, соответствующие запросу, здесь я принимаю (25 записей), третья строка кода перемещает курсор на последнюю строку, а последняя строка кода получает номер текущей строки, которая в моем случае равна 25. если нет записей, rs.last возвращает 0, а getrow перемещает курсор до первой строки, следовательно, возвращаемое отрицательное значение указывает на отсутствие записей в db

Ответ 10

это мое решение

 ResultSet rs=Statement.executeQuery("query");

    int rowCount=0;


    if (!rs.isBeforeFirst()) 
      {

           System.out.println("No DATA" );
        } else {
            while (rs.next()) {
                rowCount++; 
            System.out.println("data1,data2,data3...etc..");
            }
            System.out.println(rowCount);
            rowCount=0;
            rs.close();
            Statement.close();
      }

Ответ 11

Если ваш запрос что-то вроде этого SELECT Count(*) FROM tranbook, то сделайте это rs.next(); System.out.println(rs.getInt("Count(*)"));

Ответ 12

Вы можете использовать res.previous() следующим образом:

ResulerSet res = getDate();
if(!res.next()) {
    System.out.println("No Data Found.");
} else {
    res.previous();
    while(res.next()) {
      //code to display the data in the table.
    }
}