2013-05-15 3 views
0

Je travaille sur un projet où un utilisateur peut assembler les composants d'un cours de yoga. Il est réparti sur plusieurs fichiers et donc trop grand pour tout mettre ici. Le problème que j'ai est dans une méthode où j'ai besoin d'itérer sur les colonnes horizontales d'un ensemble de résultats qui retourne seulement une ligne à partir d'une base de données MySQL. Je comprends que je dois positionner le curseur sur la première ligne de l'ensemble de résultats (ce que je crois que je fais). Comme je n'ai qu'une seule ligne dans le jeu de résultats (ma variable est rset), je devrais utiliser rset.next() une seule fois, correct? Et puis je devrais être capable d'utiliser une simple boucle pour parcourir chaque colonne et ajouter la valeur à mon générateur de chaînes. Je souhaite ignorer la première colonne et ajouter chaque valeur suivante jusqu'à ce que la boucle atteigne les colonnes avec des valeurs nulles. Je ne trouve pas pourquoi mon code renvoie une exception "Avant le début du jeu de résultats".MySQL - Itérer sur des colonnes dans un ensemble de résultats

Quelqu'un peut-il trouver quelque chose de mal?

Je vais publier la méthode ainsi que la méthode appelée par cette méthode. (Je posté dans une autre question, mais je crois que la nature de ma question a changé, donc je suis de publier à nouveau cela avec un autre titre.)

// Query that returns the poses within a specific section 
public String listPosesInSection(String tableName, String sectionName) { 
    String strList; 
    StringBuilder strBuilderList = new StringBuilder(""); 
    // Run the query 
    try { 
     statement = connection.createStatement(); 
     // Query will collect all columns from one specific row 
     rset = statement.executeQuery("SELECT * FROM " + tableName + " WHERE " + tableName + "_name = '" + sectionName + "'"); 
     rset.next(); 
     System.out.println("Column count is " + countColumnsInTable(tableName)); 
     for (int i = 2; i <= countColumnsInTable(tableName); i++) {// First value (0) is always null, skip first column (1) 
      System.out.println("test"); 
      strBuilderList.append(rset.getString(i) + "\n"); // This is line 126 as indicated in the exception message 
      } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    strList = strBuilderList.toString(); 
    return strList.replaceAll(", $",""); // Strips off the trailing comma 
} 

// Method for getting the number of columns in a table using metadata 
public int countColumnsInTable(String sectionType) { 
    int count = 16; 
    try { 
     statement = connection.createStatement(); 
     rset = statement.executeQuery("SELECT * FROM " + sectionType); 
     rsMetaData = rset.getMetaData(); 
     count = rsMetaData.getColumnCount(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return count; 
} 

Et voici la première partie de l'exception message:

Column count is 26 
java.sql.SQLException: Before start of result set 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1078) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) 
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:855) 
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5773) 
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5693) 
at YogaDatabaseAccess.listPosesInSection(YogaDatabaseAccess.java:126) 
at YogaSectionDesigner$5.actionPerformed(YogaSectionDesigner.java:231) 

Répondre

4

me semble vous réutilisant la rset entre vos deux méthodes. Ainsi, lorsque countColumnsInTable est terminée, la variable rset pointe vers un jeu de résultats différent de ce qu'il était auparavant, en listPosesInSection. Et cet ensemble de résultats n'a pas été avancé avec next, d'où le message d'erreur que vous obtenez. Vous voulez probablement l'affecter à un ResultSet local au sein de cette méthode à la place.

public int countColumnsInTable(String sectionType) { 
    int count = 16; 
    try { 
     Statement statement = connection.createStatement(); 
     ResultSet rset = statement.executeQuery("SELECT * FROM " + sectionType); 
     ResultSetMetaData rsMetaData = rset.getMetaData(); 
     count = rsMetaData.getColumnCount(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    // Remember to clean up 
    return count; 
} 
+0

Ceci l'a fait! Merci beaucoup! –

1

essayer cette

public String listPosesInSection(String tableName, String sectionName) { 
     String strList; 
     StringBuilder strBuilderList = new StringBuilder(""); 
     // Run the query 
     try { 
      statement = connection.createStatement(); 
      // Query will collect all columns from one specific row 
      rset = statement.executeQuery("SELECT * FROM " + tableName + " WHERE " + tableName + "_name = '" + sectionName + "'"); 
      while (rset.next()){ 
      System.out.println("Column count is " + countColumnsInTable(tableName)); 
      for (int i = 2; i <= countColumnsInTable(tableName); i++) {// First value (0) is always null, skip first column (1) 
       System.out.println("test"); 
       strBuilderList.append(rset.getString(i) + "\n"); 
       } 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     strList = strBuilderList.toString(); 
     return strList.replaceAll(", $",""); // Strips off the trailing comma 
    } 
+0

Merci pour votre aide! –

1

rsete est un objet ResultSet

je pense que vous utilisez le même objet ResultSet dans listPosesInSection et aussi dans countColumnsInTable

donc ce qui se passe est ici Dans listPosesInSection, rset contient un résultat et vous avez également déplacé le curseur, mais de nouveau dans countColumnsInTable, vous utilisez le même rset de sorte qu'il est écrasé, c'est-à-dire qu'il contient un nouveau résultat maintenant, vous obtenez le nombre de colonnes mais comme il contient maintenant un nouveau résultat, le curseur sera avant le premier enregistrement donc utilisez un objet Resultset différent dans countColumnsInTable

+0

Merci! Vous êtes géniaux! –

Questions connexes