2011-07-29 3 views
1

ResultSet을 사용하여 SQL Server에서 데이터를 검색하고 있습니다. 코드는 다음과 같습니다 :이 같은 ResultSet에 걸쳐 반복하고있어ResultSet for Java에 대한 도움이 필요합니다.

ResultSet rs = getValueFormTable(); 

:

do{ 
    // process data 
} while(rs.next()); 

10 개 레코드가 가정하자와 나는 ResultSet의 네 번째 값입니다. 제 5의 ResultSet 레코드의 값 하나를 취하여 다시 네 번째 Resultset 레코드로 돌아가는 상황이 필요합니다.

그럴 수 있습니까?

+0

아니, 불행하게도 그렇지 않다. 데이터를 두 번에 걸쳐 처리해야합니다. 첫 번째에는 모든 항목을 쓰고 두 번째 항목에는 항목을 처리하십시오. – blubb

+0

당신은 배열로 결과 집합 변환 자유롭게 – marioosh

+0

@ 사이먼, @marioosh, 왜'resultSet.previous'를 사용할 수 있습니까? – Nivas

답변

7

10 개의 레코드가 있고 네 번째 ResultSet Value에 있다고 가정합니다. 다섯 번째 ResultSet의 값 하나를 취하여 네 번째 Resultset으로 다시 되돌려 놓아야하는 상황이 발생합니다. Java에서 가능합니까?

"스크롤 가능한"ResulSet 인스턴스가 있어야 결과 집합을 스크롤 할 수 있습니다. 이전 결과 집합을 업데이트해야하는 경우 스크롤 가능하고 업데이트 가능한 결과 집합이 필요합니다 (마지막 단락에서는 업데이트 가능한 결과 집합에 대해 설명합니다). 일반적으로 ResultSetTYPE_FORWARD_ONLY이고 next() 방법을 사용하여 정방향으로 만 스크롤 할 수 있습니다.

당신은 앞뒤로 ResultSet을 이동 absolute()previous() 같은 다른 방법을 호출하는 형태 TYPE_SCROLL_INSENSITIVE 또는 TYPE_SCROLL_SENSITIVEResultSet 인스턴스를 생성해야합니다. 앞서 언급 한 바와 같이 기본 유형은 TYPE_FORWARD_ONLY 같이 스크롤 ResultSet 만들기

Statement 또는 PreparedStatement 개체에 의해 반환 ResultSet의 유형을 지정해야합니다. 어떻게 그렇게 할 보여주는 스 니펫은 다음과 같습니다 :

PreparedStatement pStmt = Connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); 
ResultSet rs = pStmt.executeQuery(); 
... 
// You can now invoke rs.previous(), rs.absolute(n) etc. to move back and forth. 

당신은에 읽을 할 것입니다 방법에 고유 한 Connection.createStatement, Connection.prepareStatementConnection.prepareCall 방법에서의 ResultSet의 유형입니다.

ResultSet의 내용을 수정하고 읽을뿐만 아니라 변경하려면 "업데이트 가능"ResultSets를 만들어야합니다. ResultSet 동시성 유형을 CONCUR_UPDATABLE으로 지정하면 쉽게 완료 할 수 있습니다.그런 다음 updateXXX 방법 중 하나를 호출하고 기본 데이터 소스를 업데이트 할 updateRow 방법을 따를 수 있습니다.

1

예, 당신이 할 수있는, 당신이 경우 TYPE_SCROLL_INSENSITIVE 또는 TYPE_SCROLL_SENSITIVEResultSet

사용 ResultSet.previous

(첫 번째 행에있을 때, ResultSet.previous에 대한 호출이 false를 반환합니다 (그러나 예외가 발생하지 않습니다), 나중에 행을 호출해야하는 모든 행 (예 : resultSet.getString)을 호출하면 SQLException이 처리됩니다. ResultSet.isFirst

ResultSe 그런 방법을 많이 가지고있다면, 한번 docs을보십시오.

+0

경고를 받으면 구현할 수 없습니다. 예를 들어 당신이 MS 액세스에 연결할 수있는 JDBC-ODBC 드라이버는 오히려 당황하는 NotImplementedException을 던졌습니다. 결과 집합이 TYPE_SCROLL_INSENSITIVE' 또는'TYPE_SCROLL_SENSITIVE''로 작성되어야 함을 언급하지 않는 루프에 대한 – blubb

1

처음으로 do-whileResultSet의 결과를 얻는 좋은 방법이 아닙니다. 난 당신이 while 루프를 사용하는 recoment 것이다.

while(rs.next()){ 
    ... 
} 

초. 네, 가능하다면 이전 행으로 돌아갈 수있는 방법이 있습니다.

if(rs.previous()){ 
    //Do what value you want from previous record and jump to next record. 
} 
+0

+1, -0.2. –

관련 문제