Метод 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.