2010-02-25 18 views

Odpowiedz

28

Natychmiast po instrukcji execute można uzyskać instrukcję if. Na przykład

ResultSet rs = statement.execute(); 
if (!rs.next()){ 
//ResultSet is empty 
} 
+11

jednak, jeśli zestaw wyników nie jest pusty, przesunąłeś teraz kursor, skutecznie pomijając pierwszy wiersz. – monopoint

+0

@monopoint dokładnie – momomo

+1

@Paul Uważam, że powinieneś zaktualizować swoją odpowiedź, aby ją zakończyć, resetując kursor tuż przed pierwszym wierszem bloku else, jeśli nie jest pusty, np. 'Else {rs.beforeFirst(); } ' – sactiw

4

Oblicza rozmiar java.sql.ResultSet:

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

(Source)

+0

O ile mi wiadomo, że jest to zły pomysł ... przede wszystkim, trzeba upewnić się, że wynik może poruszać się do tyłu, po drugie, ty w tym celu wykonaj uderzenie wydajności. O wiele szybciej po prostu użyć zestawu wyników tylko do przodu i użyć pętli while (jak już sugerowali to inni tutaj). – user85116

+0

Zgadzam się ... Głosowałem za zaakceptowaną odpowiedzią, która znacznie bardziej odpowiada na pytanie. – Dolph

+0

Dolph - NICE !!!!! –

10

Czy to za pomocą rs.next():

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

Jeśli tabela wynikowa jest pusta, kod wewnątrz pętli nie można wykonać.

8

Jeśli używasz rs.next() można przesunąć kursor, niż powinien przenieść pierwszy() dlaczego nie sprawdzić przy użyciu pierwszy() bezpośrednio?

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

Zgadzam się. Dodałem poniższy kod (nie mogę dołączyć kodu z komentarzem). –

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

pamiętać, że po tej metody połączenia, jeśli resultset nie jest pusty, to na początku.

+0

W ten sposób bezpieczniej, pomyślałem. – Kachwahed

+6

ResultSet nigdy nie ma wartości NULL. – red1ynx

25

pewno daje to dobre rozwiązanie,

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 
} 
Powiązane problemy