Могу ли я изменить режим извлечения в Resultset из запроса DatabaseMetaData? - PullRequest
1 голос
/ 08 февраля 2011

Я проверяю базу данных, используя экземпляр DatabaseMetaData. Я получаю всю информацию о таблицах в БД и повторяю весь Resultset без каких-либо проблем.

В конце итерации я хочу вернуться к началу 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)

Можно ли установить режим выборки на Resultset, поступающий из DatabaseMetaData? Как я могу это сделать ??

Спасибо.

1 Ответ

1 голос
/ 09 февраля 2011

Различные типы выборок, поддерживаемые объектом ResultSet, могут различаться в зависимости от реализации и запрашиваемой базы данных. Невозможно дважды прокрутить набор результатов FORWARD_ONLY, либо установив направление выборки, либо попытавшись сбросить ResultSet перед первым элементом (хотя setFetchDirection должно генерировать исключение SQLException, а не NPE). Из API ResultSet.

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, который необходимо повторять несколько раз, состоит в том, чтобы выполнить итерацию по нему один раз и скопировать его в список. Затем вы можете безопасно прокручивать список столько раз, сколько захотите.

...