2013-05-15 57 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

谢谢!你们人很棒! –