2010-02-25 5 views

Répondre

28

Immédiatement après votre instruction execute, vous pouvez avoir une instruction if. Par exemple

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

Toutefois, si le jeu de résultats n'est pas vide, vous devez maintenant déplacer le curseur, ignorant ainsi la première ligne. – monopoint

+0

@monopoint exactement – momomo

+1

@Paul Je crois que vous devriez mettre à jour votre réponse pour la compléter en réinitialisant le curseur juste avant la première ligne dans le bloc else si elle n'est pas vide, c'est-à-dire 'else {rs.beforeFirst(); } ' – sactiw

4

Calcule la taille du java.sql.ResultSet:

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

(Source)

+0

Pour autant que je sache, c'est une mauvaise idée ... tout d'abord, vous devez vous assurer que le résultat peut se déplacer vers l'arrière, deuxièmement, vous prendre un coup de performance en faisant cela. Il est beaucoup plus rapide d'utiliser un ensemble de résultats uniquement en avant, et d'utiliser une boucle while (comme cela a déjà été suggéré par d'autres ici) – user85116

+0

D'accord ... J'ai voté la réponse acceptée, qui répond à la question beaucoup plus directement. – Dolph

+0

Dolph - NICE !!!!! –

10

Pour cela, utilisez rs.next():

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

Si le jeu de résultats est vide, le code à l'intérieur de la boucle ne sera pas exécuté.

8

Si vous utilisez rs.next(), vous déplacez le curseur, que vous devriez d'abord de se déplacer() pourquoi ne vérifient pas l'utilisation première() directement?

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

Je suis d'accord. J'ai ajouté mon code ci-dessous (ne pouvait pas inclure de code avec le commentaire). –

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

Notez que, après cet appel de méthode, si le ResultSet est pas vide, il est au début.

+0

De cette façon plus sûr, je pensais. – Kachwahed

+6

ResultSet n'est jamais nul. – red1ynx

25

Certainement cela donne une bonne solution,

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 
} 
Questions connexes