1

저는 DatabaseMetaData 인스턴스를 사용하여 데이터베이스를 검사하고 있습니다. DB에있는 테이블의 모든 정보를 얻었고 예외없이 모든 Resultset을 반복합니다.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) 

'여기까지. 내 연결 (A MSAcsess에 JDBC-OBDC)에 따르면,의는, 모드 ONLY_FORWARD 페치 나의 ResultSet의 나는 예비 모드를 허용하기 위해

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을 재설정하여 FORWARD_ONLY 결과 집합을 두 번 스크롤하는 것은 불가능합니다 (setFetchDirection에서 NPE가 아닌 SQLException을 throw해야 함). 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 처리의 표준 방법은 한 번을 반복하고이 목록에 복사하는 것입니다. 그런 다음 목록을 안전하게 여러 번 스크롤 할 수 있습니다.

+0

감사합니다. 이미 Statement 인스턴스를 통해 Fetch 방향을 설정할 수 있다는 것을 이미 알고있었습니다. 그러나이 경우 objet 문은 없습니다. ResultSet은 DatabaseMetaData에 의해 직접 반환되며 목적은 예를 들어 getTables 메소드를 호출하기 전에 Fetch Direction을 설정할지 여부를 알 수 있습니다. – jomaora

+0

앞에서 언급했듯이 포워드 결과 집합을 가져온 후에 가져 오는 방향을 설정할 수는 없습니다. DatabaseMetaData 쿼리에 대해 페치 방향 힌트를 미리 설정하는 방법이 있는지 여부에 관해서는, 나는 하나도 알지 못하지만 그것이 존재하지 않는다는 것을 의미하지는 않습니다. – gcooney

+0

또 다른 한 가지 - 명령문을 통해 페치 방향을 설정하는 것은 힌트이며 보증은 아닙니다. 모든 드라이버가 모든 가져 오기 경로를 지원하지는 않습니다. – gcooney

관련 문제