2016-09-10 2 views
2

absolute(int row)Java Doc говорит:Jaybird (Firebird JDBC) метод абсолютной()

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

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

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

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

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

При переходе к 0absolute(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) 

Searching на Соек источник (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 из ResultSet.absolute в Java 1.3.1 говорит (курсив мой):

перемещает курсор на заданное число строк в этом ResultSet объект.

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

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

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

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

Возвращает:
    верно, если курсор находится на наборе результатов; ложь в противном случае
Выдает:
    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 (Kit совместимости технологий), поскольку он был последним общедоступным, и это было изменено на адресованные ТКК.

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

Смежные вопросы