1

我正在使用DatabaseMetaData实例检查数据库。我得到了DB中所有表的信息,并且我遍历了所有的Resultset,没有任何问题。我可以通过DatabaseMetaData查询更改结果集中的提取模式吗?

在迭代结束时,我想返回到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) 

“到这里的一切似乎很正常。根据我的连接(通过JDBC OBDC到MSAcsess),我的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应抛出一个SQLException而不是NPE),但不可能通过FORWARD_ONLY结果集滚动两次。来自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的标准方法是遍历它一次并将其复制到List中。然后,您可以根据需要多次安全地滚动列表。

+0

谢谢。那么我已经知道你可以通过一个Statement实例来设置获取方向。但是在这种情况下,没有Statement对象。结果集由DatabaseMetaData直接返回,目标是知道是否可以设置提取方向,例如,在调用getTables方法之前。 – jomaora 2011-02-08 21:23:46

相关问题