1

私はDatabaseMetaDataインスタンスを使用してデータベースを検査しています。私はDB内のテーブルのすべての情報を取得し、私は問題なしですべてのResultsetを反復処理します。ResultSetのFetch ModeをDatabaseMetaDataクエリから変更できますか?

最後にResultSetの先頭に戻りたいので、next()メソッドのあとに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からの結果セットに設定することはできますか?私はどうすればいいのですか?

ありがとうございました。

答えて

1

ResultSetオブジェクトでサポートされているさまざまなフェッチタイプは、実装と照会しているデータベースによって異なる場合があります。フェッチ方向を設定するか、最初の項目の前にResultSetをリセットしようとすると(setFetchDirectionはNPEではなくSQLExceptionをスローする必要がありますが)、FORWARD_ONLY結果セットを2回スクロールすることはできません。 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() 

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

+0

ありがとうございました。まあ、私はすでにStatementインスタンスを介してフェッチの方向を設定できることを知っていました。しかし、この場合、Statement objetはありません。 ResultSetはDatabaseMetaDataによって直接返され、目的はたとえばgetTablesメソッドを呼び出す前にFetch Directionを設定できるかどうかを知ることです。 – jomaora

+0

上記のとおり、取得した後に前方のみの結果セットのフェッチ方向を設定することはできません。 DatabaseMetaDataクエリのフェッチ方向のヒントを事前に設定する方法があるかどうかについては、私は気づいていませんが、存在しないというわけではありません。 – gcooney

+0

もう1つのこと - ステートメントを介してフェッチ方向を設定することはヒントであり、保証ではありません。すべてのドライバがすべてのフェッチ方向をサポートするわけではありません。 – gcooney