2011-11-28 21 views
48

Użyłem wartości ResultSet, która zwraca pewną liczbę wierszy. Mój kod jest coś takiego:Uzyskaj liczbę wierszy zwróconych przez ResultSet w języku Java

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

Czy istnieje jakiś sposób, aby sprawdzić liczbę wierszy zwracanych przez ResultSet? Czy muszę napisać własną?

+0

Duplikat: http://stackoverflow.com/questions/7545820/total-number-of-row-resultset-getrow-method –

Odpowiedz

47

Można użyć do ... while pętlę zamiast while pętli, tak że rs.next() nazywa po pętla jest wykonywana w następujący sposób:

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()); 
} 

Albo liczyć wierszy siebie jako, że je się:

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"); 
} 
+0

Używam powyższego kodu, ale i wyświetlam rekordy, ale traci pierwszy rekord –

+0

indeks wiersza zaczyna się od 1 w resultSet –

+0

@ FranciscI.B W powyższych przykładach nie stosuje się indeksu wiersza, więc nie ma znaczenia, czy indeks wiersza zaczyna się od 1 czy cokolwiek innego. – Jesper

4

res.next() Metoda przeniesie wskaźnik do następnego wiersza. i w twoim kodzie używasz go dwa razy, najpierw dla warunku if (kursor przesuwa się do pierwszego rzędu), a następnie do warunku while (kursor przesuwa się do drugiego rzędu).

Po uzyskaniu dostępu do wyników rozpoczyna się od drugiego rzędu. Więc pokazuje jeden rząd mniej w wynikach.

można spróbować to:

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

Po pierwsze, należy utworzyć Statement która może być przesunąć kursor za pomocą polecenia:

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

następnie pobrać ResultSet jak poniżej:

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

Przenieś kursor do ostatniego wiersza i pobierz go:

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

Następnie rzędy zmienna zawiera liczbę wierszy zwracanych przez sql

22

Prosta metoda getRowCount może wyglądać następująco:

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; 
} 

Wystarczy mieć świadomość, że ta metoda będzie potrzebował przewijanie wrażliwego wyniku Ustaw tak, aby podczas tworzenia połączenia określić opcję przewijania. Domyślna wartość to FORWARD i użycie tej metody spowoduje zgłoszenie wyjątku.

+0

ResultSet.last(); wiersz zwraca wartość logiczną, proszę podać instrukcję. –

7

Innym sposobem na odróżnienie 0 wierszy lub kilku rzędach z 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. 
    } 
} 

Jeśli trzeba znać liczbę wierszy podanych zestaw wyników, tutaj jest to metoda, aby to:

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

można użyć res.previous() następująco:

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. 
    } 
} 
0

można załadować do wynikowego a TableModel, następnie stwórz JTable, który używa tego TableModel, a następnie użyj metody table.getRowCount(). Jeśli chcesz wyświetlić wynik zapytania, musisz to zrobić mimo to.

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

Można liczyć z sql i odzyskać odpowiedź od wynikowego tak:

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)); 
      } 

Tutaj liczę wszystko, ale można łatwo modyfikować SQL policzyć na podstawie kryterium.

0
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()); 

pierwsza linia kodu mówi, że możemy przejść w dowolnym miejscu wynikowego (albo do pierwszego rzędu lub ostatniego wiersza lub przed pierwszym rzędzie bez konieczności przechodzić wiersz po wierszu, począwszy od pierwszego wiersza, który jest czas biorąc). Druga linia kodu pobiera rekordy pasujące do zapytania tutaj zakładam (25 rekordów), trzecia linia kodu przesuwa kursor do ostatniego wiersza, a ostatnia linia kodu pobiera bieżący numer wiersza, który wynosi 25 w moim przypadku. jeśli nie istnieją żadne zapisy, rs.last zwraca 0 i getrow przesuwa kursor przed pierwszym rzędzie powraca tym samym wartość ujemna oznacza brak zapisów w dB

+0

Czy możesz opracować z wyjaśnieniem, w jaki sposób może to pomóc? – kommradHomer

+0

@kommradHomer pierwsza linia kodu mówi, że możemy przesuwać się w dowolnym miejscu w zestawie wyników (do pierwszego wiersza lub ostatniego wiersza lub przed pierwszym wierszem bez potrzeby przechodzenia przez kolejne wiersze, począwszy od pierwszego wiersza, co zajmuje czas). Drugi wiersz kodu pobiera rekordy pasujące do zapytania tutaj zakładam (25 rekordów), trzecia linia kodu przesuwa kursor do ostatniego wiersza, a ostatnia linia kodu pobiera bieżący numer wiersza, który wynosi 25 w moim przypadku. jeśli nie ma rekordów, rs.last zwraca 0, a getrow przesuwa kursor do pierwszego wiersza, dlatego zwracanie wartości ujemnej wskazuje brak rekordów w db. –

1

to moje rozwiązanie

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(); 
     } 
0
 rs.last(); 
     int rows = rs.getRow(); 
     rs.beforeFirst(); 
Powiązane problemy