Что должно произойти в ResultSet # дальше с курсором на строке вставки? - PullRequest
1 голос
/ 02 февраля 2011

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

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

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

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

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

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

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

1 голос
/ 20 февраля 2011

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

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

...