Могу ли я изменить режим выборки в наборе результатов из запроса DatabaseMetaData?

Я проверяю базу данных, используя экземпляр 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? Как мне это сделать??

Спасибо.


person jomaora    schedule 08.02.2011    source источник


Ответы (1)


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

person gcooney    schedule 08.02.2011
comment
Спасибо. Ну, я уже знал, что вы можете установить направление выборки через экземпляр оператора. Однако в этом случае нет объекта Statement. Набор результатов возвращается непосредственно DatabaseMetaData, и цель состоит в том, чтобы узнать, возможно или нет установить направление выборки, например, перед вызовом метода getTables. - person jomaora; 09.02.2011
comment
Как я упоминал выше, вы не можете установить направление выборки набора результатов только вперед после того, как вы его извлекли. Что касается того, есть ли способ заранее установить подсказку направления выборки для запросов DatabaseMetaData, я не знаю об одном, но это не значит, что его не существует. - person gcooney; 09.02.2011
comment
Еще одна вещь - установка направления выборки с помощью инструкции - это подсказка, а не гарантия. Не все драйверы поддерживают все направления выборки. - person gcooney; 09.02.2011
comment
Спасибо. Я тоже думаю, что, возможно, этого средства не существует. :) - person jomaora; 09.02.2011