2011-02-02 2 views
1

나는 여기 손실에 조금이다. 나는 특정 목적을 위해 javax.sql.RowSet의 구현을 작성해야하고, 가능한 한 단위 테스트를하려고합니다.삽입 행의 커서로 ResultSet # next에서 발생해야하는 것은 무엇입니까?

이제 ResultSet에는 정상적인 행 (또는 첫 번째 또는 마지막 행) 또는 삽입 행에있을 수있는 커서가 있습니다. moveToInsertRow() 메시지 :

커서가 삽입 행에있을 때만 updater, getter 및 insertRow 메서드가 호출 될 수 있습니다.

그 다음에는 무엇이 일어나야하는지에 대해서는 언급하지 않습니다.

한 줄을 현재 위치에서 앞으로 이동합니다. ResultSet 커서는 처음에 첫 번째 행 앞에 위치합니다. 다음에 메소드를 처음 호출하면 첫 번째 행이 현재 행이됩니다. 두 번째 호출은 두 번째 행을 현재 행으로 만드는 식입니다.

다음 메서드를 호출 할 때 false이 반환되면 커서는 마지막 행 뒤에 위치합니다. 현재 행이 필요한 ResultSet 메소드를 호출하면 SQLException이 발생합니다. 결과 집합 유형이 TYPE_FORWARD_ONLY이면 해당 JDBC 드라이버 구현이 false을 반환하는지 아니면 next을 호출 할 때 SQLException을 throw할지 지정합니다.

입력 스트림이 현재 행에 대해 열려있는 경우 next 메서드를 호출하면 암묵적으로 닫힙니다. 새 행을 읽을 때 ResultSet 개체의 경고 체인이 지워집니다.

결과 :
true 새로운 현재 행이 유효한 경우; 행이 더 이상없는 경우 false

예외 :
SQLException - 데이타베이스 액세스 에러가 발생했을 경우, 또는

내가 JDBC API에 대한 사전 경험이없는 세트를이 메소드가 클로즈 된 결과에 불려 갔을 경우 따라서 의도적으로 지정되지 않았는지 (정의되지 않은 동작인가?) 또는 단순한 감독인지 여부에 대한 단서가 없습니다.

은 현재 내가 (- 여기 경우 것이 어느 것도 SQLException는 DB 오류 또는 폐쇄 ResultSet 신호로) 난 그냥 그 곳이 지정되지 않은 것 때문에 아마 UnsupportedOperationException 더 나은 것에도 불구하고 SQLException 던질 거라고 생각합니다.

아니면 어딘가에 약간의 설명서가 누락 되었습니까?

+0

그 자체로 동일한 문서가 저의 머리를 회전 시켰습니다. 100 행을로드한다고 가정 해 보겠습니다. 1) Resultset에서 next()를 호출하면 '입력 스트림'을 말할 때 그들이 말하는 것은 무엇입니까? 2) 나중에 SQLException을 얻지 않고 동일한 ResultSet에서 absolute (-1)를 다시 호출 할 수 있습니까? 3)이 '경고 사슬'은 무엇입니까? – JGFMK

+0

@JGFMK : 1. 입력 스트림은 여전히 ​​열 수있는'update * Stream' 메소드 중 하나와 함께 전달 된'InputStream' 객체입니다. 2.'절대 (-1)'소리가 이상하게 들리지만 지금 당장은 문서가 없지만 "빼기"행이 없으므로 오류라고 생각합니다. 3. 경고 체인은 다양한 메소드를 호출 할 때 데이터베이스에서 발생한 경고를 수집합니다. 내 구현에서는 사용되지 않았기 때문에 (CSV 파일은 경고를 생성하지 않으므로) 너무 신경 쓰지 않았습니다. 결과적으로 알아낼 수 있어야하지만, RowSet의 200 가지 이상의 메소드는 이것을 쉽게 만들지 않습니다. – Joey

+0

절대 (-1)은 마지막 행에 위치합니다. 상대 (-1)은 이전()과 동일 http://download.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#relative(int) – JGFMK

답변

1

moveToInsertRow() 계약을 따르고 어떤 종류의 예외 (SQL- 또는 IllegalState-)를 던집니다. 사람들이 실수로 next()으로 전화를 걸면이 문제가 가장 적게 발생할 것입니다.

당신이 사용하는 다른 프레임 워크가 놀랄만하지 않도록 다른 사람들의 구현 (MySQL Connector/J 예)을 볼 수도 있습니다.

+0

@Joey - 지적했듯이 API는 정의되지 않았습니다. 원하는 것을 선택할 수 있습니다. 내가 말했듯이, 예외를 던지는 것이 가장 중요합니다. 다른 프레임 워크를 놀라게하지 않기 위해 다른 사람들이하는 일을 볼 수도 있습니다. – OrangeDog

1

moveToInsertRow() 다음에 실제로 동작을 테스트하기 위해 작은 프로그램을 작성하는 것이 어떻습니까 next()?

나는 TDDer이지만 때로는 "외국"API를 사용하는 프로그램을 프로그래밍 할 때 실제로는 "스파이크 (spike)"라고 불리는 테스트하지 않은 작은 개념을 만들 것입니다. 서로 다른 API 호출이 상호 작용하는 방식에 대해 알아보십시오. API를 잘 이해 한 것처럼 스파이크를 버리고 일반 TDD 방식으로 코딩을 시작합니다.