Что должно произойти в ResultSet#next с курсором на строке вставки?

Я немного в растерянности. Я должен написать реализацию javax.sql.RowSet для определенной цели, и я пытаюсь провести модульное тестирование, насколько это возможно.

Теперь ResultSet имеет курсор, который может находиться в обычной строке (или перед первой или после последней) или в строке вставки. moveToInsertRow() говорит:

Только методы updater, getter и insertRow могут быть вызваны, когда курсор находится на вставляемой строке.

Ничего не сказано о том, что должно произойти тогда. next() менее полезен, даже не указывая на этот случай:

Перемещает курсор вперед (sic!) на одну строку от его текущей позиции. Курсор ResultSet изначально располагается перед первой строкой; первый вызов метода next делает первую строку текущей строкой; второй вызов делает вторую строку текущей строкой и так далее.

Когда вызов следующего метода возвращает false, курсор располагается после последней строки. Любой вызов метода ResultSet, для которого требуется текущая строка, приведет к выдаче SQLException. Если тип набора результатов — TYPE_FORWARD_ONLY, поставщик указывает, будет ли их реализация драйвера JDBC возвращать false или выдавать SQLException при последующем вызове next.

Если входной поток открыт для текущей строки, вызов метода next неявно закроет его. Цепочка предупреждений объекта ResultSet очищается при чтении новой строки.

Возвращает:
true, если новая текущая строка действительна; false если строк больше нет

Выдает:
SQLException — если возникает ошибка доступа к базе данных или этот метод вызывается для закрытого набора результатов.

У меня нет предыдущего опыта работы с JDBC API, и поэтому я понятия не имею, намеренно ли это не указано (может быть, неопределенное поведение?) Или просто недосмотр.

В настоящее время я думаю, что просто выдал бы SQLException, даже если это нигде не указано, и поэтому, возможно, UnsupportedOperationException было бы лучше (поскольку SQLException сигнализирует об ошибке БД или закрытом ResultSet - ни то, ни другое здесь не имеет место).

Или я просто где-то пропустил часть документации?


person Joey    schedule 02.02.2011    source источник
comment
Та самая документация вскружила мне голову. Допустим, вы загружаете 100 строк. 1) Если вы вызываете next() для набора результатов, о чем они говорят, когда говорят о «входном потоке»? 2) Можете ли вы впоследствии снова вызвать absolute(-1) для того же ResultSet без получения SQLException? 3) Что это за «цепочка предупреждений»?   -  person JGFMK    schedule 21.02.2011
comment
@JGFMK: 1. Входной поток — это объект InputStream, переданный с помощью одного из методов update*Stream, который все еще может быть открыт. 2. absolute(-1) сейчас звучит странно, и у меня нет под рукой документов, но я думаю, что это должно быть ошибкой, поскольку нет строки «минус первая». 3. Цепочка предупреждений собирает предупреждения, с которыми сталкивается база данных при вызове различных методов. В моей реализации он не использовался (поскольку CSV-файл не будет создавать предупреждений), поэтому мне было все равно. В конце концов вы сможете понять это, но более 200 методов RowSet не облегчают эту задачу.   -  person Joey    schedule 21.02.2011
comment
absolute(-1) будет располагаться в последней строке. относительный(-1) такой же, как предыдущий() download.oracle.com/javase/6/docs/api/java/sql/   -  person JGFMK    schedule 21.02.2011
comment
@JGFMK: А, тогда извини. Забыл это.   -  person Joey    schedule 21.02.2011
comment
Понижение. Какой милый. Любая причина для этого?   -  person Joey    schedule 03.08.2012


Ответы (2)


Я предлагаю вам следовать контракту moveToInsertRow() и создать какое-то исключение (SQL- или IllegalState-). Это вызовет наименьшие проблемы, если люди по ошибке назовут next().

Вы также можете взглянуть на реализацию других, чтобы увидеть, что они делают (например, MySQL Connector/J), чтобы другие используемые вами фреймворки не удивлялись.

person OrangeDog    schedule 20.02.2011
comment
@Joey - Как вы заметили, API не определен. Вы можете выбрать, чем вы хотите заниматься. Как я уже сказал, имеет смысл создать исключение. Вы также можете посмотреть, что делают другие, чтобы не удивлять другие фреймворки. - person OrangeDog; 21.02.2011

Как насчет того, чтобы просто написать небольшую программу для проверки поведения next() после moveToInsertRow()?

Я TDDer, но иногда, когда я программирую что-то, что использует «чужой» API, я создаю небольшое доказательство концепции, которое на самом деле не тестируется, обычно называемое «спайком», таким образом я могу узнать, как разные Вызовы API взаимодействуют. Когда я чувствую, что хорошо разбираюсь в API, я просто выбрасываю шип и начинаю кодировать в обычном режиме TDD.

person CarlosZ    schedule 20.02.2011