2013-05-15 88 views
0

我正在開發一個用戶可以組裝瑜伽課程組件的項目。它分佈在多個文件中,因此太大而無法放在這裏。我遇到的麻煩是在一種方法中,我需要遍歷從MySQL數據庫返回僅一行的結果集的水平列。MySQL - 迭代結果集中的列

我知道我必須將光標放在結果集的第一行(我相信我正在做)。由於在結果集中只有一行(我的變量是rset),因此我應該只使用rset.next()一次,對嗎?然後我應該可以使用一個簡單的循環遍歷每一列並將值附加到我的String Builder。我想跳過第一列並追加每個後續值,直到循環到達具有空值的列。我找不到爲什麼我的代碼不斷返回「結果集開始之前」異常。

任何人都可以發現任何錯誤?

我將發佈該方法以及由此方法調用的方法。 (我在一個不同的問題張貼了這個,但我相信我的問題的性質發生了變化,所以用不同的標題,我重新發布此。)

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

這裏是例外的第一部分消息:就像你重新使用兩種方法之間的rset

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) 

回答

4

在我看來。因此,當countColumnsInTable已完成時,rset變量指向與之前不同的結果集,在listPosesInSection中。並且該結果集尚未使用next進行升級,因此您收到錯誤消息。您可能希望將其分配給該方法中的本地ResultSet

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

這樣做了!非常感謝! –

1

試試這個

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

感謝您的幫助! –

1

RSET爲ResultSet對象

我認爲你是使用listPosesInSection並在countColumnsInTable

所以這裏發生了什麼是一樣的ResultSet對象在listPosesInSection rset中保存了一個結果,並且你也移動了遊標,但是又一次在countColumnsInTable中使用了相同的rset,所以它被覆蓋,即它保存了一個現在新的結果,你得到的列數,但因爲它現在擁有一個新的結果光標將在第一條記錄之前,所以使用countColumnsInTable中的不同的Resultset對象

+0

謝謝!你們人很棒! –