MySQL - 迭代结果集中的列

时间:2013-05-15 11:43:57

标签: java mysql loops resultset

我正在开发一个用户可以组装瑜伽课程组件的项目。它分布在几个文件中,因此太大而无法放在这里。我遇到的麻烦是在一种方法中,我需要迭代结果集的水平列,该结果集只从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;
}

这是异常消息的第一部分:

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)

3 个答案:

答案 0 :(得分:4)

在我看来,就像你在两种方法之间重新使用rset一样。因此,当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;
}

答案 1 :(得分: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
    }

答案 2 :(得分:1)

rset是一个ResultSet对象

我认为你在listPosesInSection和countColumnsInTable中使用相同的ResultSet对象

所以这里发生的事情是在listPosesInSection中,rset保存一个结果,你也移动了光标但是再次在countColumnsInTable中你使用相同的rset所以它被覆盖,即它现在保持一个新的结果,你得到的数量列,但由于它现在保持一个新的结果,光标将在第一个记录之前,所以在countColumnsInTable中使用不同的Resultset对象