1

DatabaseMetaData インスタンスを使用してデータベースを検査しています。DB 内のテーブルのすべての情報を取得し、すべての結果セットを問題なく反復処理します。

繰り返しの最後に、ResultSet の先頭に戻りたいので、beforeFirst() メソッドを呼び出し、次に next() メソッドを呼び出して、ResultSet の最初の要素を取得します。これが私のコードです:

connect(request.getParameter("source"));
DatabaseMetaData patrol = link.getMetaData();
answer = patrol.getTables(null, null, null, null);
while (answer.next()) {
    String nomTable = answer.getString("TABLE_NAME");
    System.out.println(nomTable)
}

answer.beforeFirst();
answer.next();
String table = answer.getString("TABLE_NAME");
answer.close();

すべての結果を取得しましたが、次の例外があります。

java.sql.SQLException: Result set type is TYPE_FORWARD_ONLY
        at sun.jdbc.odbc.JdbcOdbcResultSet.beforeFirst(Unknown Source)
        at InspectDB.doPost(InspectDB.java:59)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:840)
        at com.sun.web.core.ServletWrapper.handleRequest(ServletWrapper.java:155
)
        at com.sun.web.core.InvokerServlet.service(InvokerServlet.java:168)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:840)
        at com.sun.web.core.ServletWrapper.handleRequest(ServletWrapper.java:155
)
        at com.sun.web.core.Context.handleRequest(Context.java:414)
        at com.sun.web.server.ConnectionHandler.run(ConnectionHandler.java:139)

「ここまではすべて正常に見えます。私の接続 (MSAcsess への JDBC-OBDC) によると、私の ResultSet のフェッチ モードは ONLY_FORWARD であるため、次を使用して変更しようとしました。

answer.setFetchDirection(ResultSet.FETCH_REVERSE);
answer.beforeFirst();
answer.next();

予約モードを許可するために...しかし、それは私を許可しません。新しい例外:

java.lang.NullPointerException
    at sun.jdbc.odbc.JdbcOdbcResultSet.setFetchDirection(Unknown Source)
    at InspectDB.doPost(InspectDB.java:58)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:747)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:840)
    at com.sun.web.core.ServletWrapper.handleRequest(ServletWrapper.java:155)
    at com.sun.web.core.InvokerServlet.service(InvokerServlet.java:168)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:840)
    at com.sun.web.core.ServletWrapper.handleRequest(ServletWrapper.java:155)
    at com.sun.web.core.Context.handleRequest(Context.java:414)
    at com.sun.web.server.ConnectionHandler.run(ConnectionHandler.java:139)

フェッチ モードを DatabaseMetaData からの結果セットに設定することは可能ですか? どうすればできますか??

ありがとう。

4

1 に答える 1

1

ResultSet オブジェクトでサポートされるさまざまなフェッチ タイプは、実装とクエリ対象のデータベースによって異なります。フェッチ方向を設定するか、最初の項目の前に ResultSet をリセットしようとしても、FORWARD_ONLY 結果セットを 2 回スクロールすることはできません (ただし、setFetchDirection は NPE ではなく SQLException をスローする必要があります)。ResultSet API から。

void setFetchDirection(int direction)
                       throws SQLException

    Gives a hint as to the direction in which the rows in this ResultSet object will be processed. The initial value is determined by the Statement object that produced this ResultSet object. The fetch direction may be changed at any time.

    Parameters:
        direction - an int specifying the suggested fetch direction; one of ResultSet.FETCH_FORWARD, ResultSet.FETCH_REVERSE, or ResultSet.FETCH_UNKNOWN 
    Throws:
        SQLException - if a database access error occurs; this method is called on a closed result set or the result set type is TYPE_FORWARD_ONLY and the fetch direction is not FETCH_FORWARD
    Since:
        1.2
    See Also:
        Statement.setFetchDirection(int), getFetchDirection()

複数回反復する必要がある ResultSet を処理する標準的な方法は、一度反復してリストにコピーすることです。その後、リストを安全に何度でもスクロールできます。

于 2011-02-08T21:09:54.530 に答える