다음을 통해 공유


레코드 집합에서 이동하는 다양한 방법

MoveFirst, MoveLast, MoveNext, MovePrevious의 네 가지 메서드는 Recordset에서 이동하거나 스크롤하는 데 사용됩니다. (이러한 메서드 중 일부는 정방향 전용 커서에서 사용할 수 없습니다.)

MoveFirst는 현재 레코드 위치를 Recordset의 첫 번째 레코드로 변경합니다. MoveLast는 현재 레코드 위치를 Recordset의 마지막 레코드로 변경합니다. MoveFirst 또는 MoveLast를 사용하려면 Recordset 개체가 책갈피 또는 역방향 커서 이동을 지원해야 합니다. 그렇지 않으면 메서드 호출이 오류를 생성합니다.

MoveNext는 현재 레코드 위치를 한 위치 앞으로 이동합니다. MoveNext를 호출할 때 마지막 레코드에 있는 경우 EOFTrue로 설정됩니다. MovePrevious는 현재 레코드 위치를 한 위치 뒤로 이동합니다. MovePrevious를 호출할 때 첫 번째 레코드에 있는 경우 BOFTrue로 설정됩니다. 다음과 같이 이러한 메서드를 사용할 때 EOFBOF 속성을 확인하고 Recordset의 양쪽 끝을 벗어나면 커서를 유효한 현재 레코드 위치로 다시 이동하는 것이 중요합니다.

. . .  
oRs.MoveNext  
If oRs.EOF Then oRs.MoveLast  
. . .   

또는 MovePrevious 메서드의 경우 다음을 수행합니다.

. . .   
oRs.MovePrevious  
If oRs.BOF Then oRs.MoveFirst  
. . .  

Recordset가 필터링 또는 정렬되고 현재 레코드의 데이터가 변경된 경우 위치도 변경될 수 있습니다. 이러한 경우 MoveNext 메서드는 정상적으로 작동하지만 위치가 이전 위치가 아닌 새 위치에서 한 레코드 앞으로 이동된다는 점에 유의하세요. 예를 들어 레코드가 정렬된 Recordset의 끝으로 이동되도록 현재 레코드의 데이터를 변경하면 MoveNext를 호출하면 ADO에서 현재 레코드를 Recordset(EOF = True)의 마지막 레코드 다음 위치로 설정하게 됩니다.

Recordset 개체의 다양한 Move 메서드 동작은 Recordset 내의 데이터에 따라 어느 정도 달라집니다. Recordset에 추가된 새 레코드는 처음에 특정 순서로 추가됩니다. 이 순서는 데이터 원본에 의해 정의되며 새 레코드의 데이터에 암시적으로 또는 명시적으로 종속될 수 있습니다. 예를 들어 Recordset를 채우는 쿼리 내에서 정렬 또는 조인이 수행되면 Recordset 내의 적절한 위치에 새 레코드가 삽입됩니다. Recordset를 만들 때 순서를 명시적으로 지정하지 않은 경우 데이터 원본 구현을 변경하면 반환된 행의 순서가 실수로 변경될 수 있습니다. 또한 Recordset의 정렬, 필터링, 편집 함수는 순서에 영향을 줄 수 있으며 레코드 집합의 어떤 행이 표시될 수도 있습니다.

따라서 MoveNext, MovePrevious, MoveFirst, MoveLast, Move는 모두 동일한 Recordset에서 수행되는 다른 작업에 민감합니다. ADO는 명시적으로 이동할 때까지 항상 현재 위치를 유지하려고 하지만, 경우에 따라 변경 내용이 개입되면 후속 이동의 영향을 이해하기 어려울 수 있습니다. 예를 들어 MoveFirst를 호출하여 정렬된 Recordset의 첫 번째 행에 배치하고 정렬을 오름차순에서 내림차순으로 변경하는 경우 여전히 동일한 행에 있지만 이제는 Recordset의 마지막 행입니다. MoveFirst는 다른 행(새 첫 번째 행)으로 이동합니다.

또 다른 예로 Recordset 중간에 있는 특정 행에 위치하고 Delete를 호출한 다음, MoveNext를 호출하면 삭제된 레코드 바로 다음에 레코드가 표시됩니다. 그러나 MovePrevious를 호출하면 삭제된 레코드가 Recordset의 활성 멤버 자격에 더 이상 계산되지 않으므로 현재 레코드를 삭제한 레코드 앞에 레코드가 만들어집니다.

현재 레코드의 데이터 변경에 직면하여 현재 레코드(MovePrevious, MoveNext, Move)를 기준으로 이동하는 메서드에 대해 모든 공급자에서 일관된 이동 의미 체계를 정의하는 것은 특히 어렵습니다. 예를 들어 정렬된 필터링된 Recordset로 작업하는 경우 다른 모든 레코드 앞에 오도록 현재 레코드의 데이터를 변경하지만 변경된 데이터도 필터와 더 이상 일치하지 않는 경우 MoveNext 작업에서 어디로 이동해야 하는지 명확하지 않습니다. 가장 안전한 결론은 레코드를 편집, 추가 또는 삭제하는 동안 데이터가 변경될 때 Recordset 내의 상대 이동이 절대 이동(예: MoveFirst 또는 MoveLast 사용)보다 위험하다는 것입니다. 정렬 및 필터링은 이 유형의 값이 변경되지 않아야 하므로 기본 키 또는 ID를 기반으로 해야 합니다.