Метод Jaybird (Firebird JDBC) absolute()

absolute(int row) Java Doc говорит:

Перемещает курсор к указанному номеру строки в этом объекте ResultSet. Если номер строки положительный, курсор перемещается к заданному номеру строки относительно начала набора результатов. Первая строка - это строка 1, вторая - строка 2 и т. Д.

Если заданный номер строки отрицателен, курсор перемещается в абсолютную позицию строки относительно конца набора результатов. Например, при вызове метода absolute(-1) курсор помещается в последнюю строку; вызов метода absolute(-2) перемещает курсор к следующей строке, и так далее.

Если указанный номер строки равен нулю, курсор перемещается перед первой строкой.

Попытка поместить курсор за первую / последнюю строку в наборе результатов оставляет курсор перед первой строкой или после последней строки.

Примечание. Вызов абсолютного значения (1) аналогичен вызову first(). Вызов абсолютного (-1) аналогичен вызову last().

При прохождении 0 в absolute(int row) метод должен вести себя как beforeFirst() позиционирование курсора непосредственно перед первой строкой.

Но с помощью Jaybird у меня есть это исключение:

Exception in thread "main" org.firebirdsql.jdbc.FBSQLException: You cannot position to the row 0 with absolute() method.
    at org.firebirdsql.jdbc.FBCachedFetcher.absolute(FBCachedFetcher.java:243)
    at org.firebirdsql.jdbc.FBCachedFetcher.absolute(FBCachedFetcher.java:232)
    at org.firebirdsql.jdbc.AbstractResultSet.absolute(AbstractResultSet.java:1371)
    at chapterA.ResultSets.main(ResultSets.java:180)

Поиск по источнику Jaybird (FBCachedFetcher.java) Я обнаружил, что когда параметр строки равен 0, он генерирует исключение:

private boolean absolute(int row, boolean internal) throws SQLException {
        checkScrollable();

        if (row < 0) {
            row = rows.size() + row + 1;
        }

        if (row == 0 && !internal) {
            throw new SQLException("You cannot position to row 0 with absolute() method.");
        }

Есть ли причина для такого поведения?

Заранее спасибо!

1 ответ

Решение

Учитывая Javadoc, это ошибка в Jaybird. Я создал JDBC-453, чтобы исправить это в Jaybird 2.2.12 (и 3.0.0). Я сделал некоторую археологию, чтобы выяснить, почему это было реализовано таким образом.

Исторически зовет absolute(0) не было разрешено в JDBC 2 / Java 1.3 (и ранее). Javadoc of ResultSet.absolute в Java 1.3.1 говорится (выделено мое):

Перемещает курсор к указанному номеру строки в этом объекте ResultSet.

Если номер строки положительный, курсор перемещается к заданному номеру строки относительно начала набора результатов. Первая строка - это строка 1, вторая - строка 2 и т. Д.

Если заданный номер строки отрицателен, курсор перемещается в абсолютную позицию строки относительно конца набора результатов. Например, при вызове метода absolute(-1) курсор помещается в последнюю строку; вызов метода absolute(-2) перемещает курсор к следующей строке, и так далее.

Попытка поместить курсор за первую / последнюю строку в наборе результатов оставляет курсор перед первой строкой или после последней строки.

Примечание. Вызов абсолютного значения (1) аналогичен вызову first(). Вызов абсолютного (-1) аналогичен вызову last().

Возвращает:
Значение true, если курсор находится на наборе результатов; ложь в противном случае
Броски:
SQLException - если возникает ошибка доступа к базе данных, строка0или тип набора результатов TYPE_FORWARD_ONLY

Другими словами, используя 0 в качестве значения параметра было запрещено. Однако в этой же записи предложение "Попытка поместить курсор за первую / последнюю строку в наборе результатов оставляет курсор перед первой строкой или после последней строки". предполагает, что это должно было быть разрешено.

Для JDBC 3 / Java 1.4.2 (и Java 5) это было изменено на:

Броски: SQLException - если возникает ошибка доступа к базе данных или тип набора результатов TYPE_FORWARD_ONLY

Выделенное предложение ("Если указанный номер строки равен нулю, курсор перемещается до первой строки") было добавлено только в JDBC 4.1 (Java 7) для дальнейшего пояснения.

Однако, глядя на историю изменений FBCachedFetcherэто ограничение было добавлено в июле 2004 года, когда Java 1.4.2 уже была доступна в течение некоторого времени (и Java 5 была почти готова). В то время я еще не присоединился к проекту, но единственная причина, о которой я могу подумать, это то, что код был протестирован с помощью JDBC 2 TCK (Technology Compatibility Kit), так как он был последним общедоступным, и он был изменен на решать проблемы, о которых сообщает TCK.

Раскрытие информации: я являюсь разработчиком JDBC-драйвера Jaybird / Firebird.

Другие вопросы по тегам