0

ユーザーがヨガクラスのコンポーネントを組み立てることができるプロジェクトに取り組んでいます。複数のファイルに分散しているため、大きすぎてすべてをここに置くことはできません。私が抱えている問題は、MySQL データベースから 1 行だけを返す結果セットの水平方向の列を反復処理する必要がある 1 つの方法にあります。

結果セットの最初の行にカーソルを配置する必要があることを理解しています(そうしていると思います)。結果セット (私の変数は rset) には 1 つの行しかないので、rset.next() は 1 回だけ使用する必要があります。そして、単純なループを使用して各列を反復処理し、値を String Builder に追加できるはずです。ループが null 値を持つ列に到達するまで、最初の列をスキップして後続の各値を追加したいと考えています。コードが「結果セットの開始前」例外を返し続ける理由がわかりません。

誰でも何か間違ったことを見つけることができますか?

メソッドと、このメソッドによって呼び出されるメソッドを投稿します。(これは別の質問に投稿しましたが、質問の性質が変わったと思うので、別のタイトルで再投稿します。)

    // 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)
4

3 に答える 3

4

rsetあなたの2つの方法の間で再利用しているように見えます。そのため、 countColumnsInTableが完了すると、rset変数は以前とは異なる結果セット ( in ) を指しています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;
}
于 2013-05-15T11:47:55.833 に答える
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
    }
于 2013-05-15T11:49:46.887 に答える
1

rset は ResultSet オブジェクトです

listPosesInSection と countColumnsInTable で同じ ResultSet オブジェクトを使用していると思います

したがって、ここで何が起こっているかは listPosesInSection rset で結果を保持し、カーソルも移動しましたが、countColumnsInTable で同じ rset を使用しているため、上書きされます。つまり、新しい結果が保持されます。列の数を取得していますが、新しい結果が保持されるようになり、カーソルは最初のレコードの前になるため、countColumnsInTable で別の結果セット オブジェクトを使用します。

于 2013-05-15T11:58:29.400 に答える