다음을 통해 공유


레코드 집합 작업

Recordset 개체에는 결과 집합의 데이터 순서를 다시 정렬하고, 제공하는 조건에 따라 특정 레코드를 검색하고, 인덱스를 사용하여 해당 검색 작업을 최적화할 수 있는 기본 제공 기능이 있습니다. 이러한 기능을 사용할 수 있는지 여부는 공급자와 Index 속성과 같은 경우에 따라 데이터 원본 자체의 구조에 따라 달라집니다.

데이터 정렬

Recordset 데이터를 정렬하는 가장 효율적인 방법은 결과를 반환하는 데 사용되는 SQL 명령에 ORDER BY 절을 지정하는 것입니다. 그러나 이미 만들어진 레코드 집합 데이터의 순서를 변경해야 할 수 있습니다. Sort 속성을 사용하여 Recordset 행이 트래버스되는 순서를 설정할 수 있습니다. 또한 Filter 속성은 행을 트래버스할 때 액세스할 수 있는 행을 결정합니다.

Sort 속성은 정렬할 Recordset 필드 이름을 나타내는 String 값을 설정하거나 반환합니다. 각 이름은 쉼표로 구분되며 필요에 따라 ASC (필드를 오름차순으로 정렬) 또는 DESC(필드를 내림차순으로 정렬) 공백과 키워드가 뒤에 옵니다. 기본적으로 키워드가 지정되지 않은 경우 필드는 오름차순으로 정렬됩니다.

데이터가 물리적으로 다시 정렬되지는 않지만 인덱스로 지정된 순서대로 액세스되므로 정렬 작업이 효율적입니다.

Sort 속성을 사용하려면 CursorLocation 속성을 adUseClient로 설정해야 합니다. 인덱스가 아직 없는 경우 Sort 속성에 지정된 각 필드에 대해 임시 인덱스가 만들어집니다.

Sort 속성을 빈 문자열로 설정하면 행이 원래 순서로 다시 설정되고 임시 인덱스가 삭제됩니다. 기존 인덱스는 삭제되지 않습니다.

RecordsetfirstName, middleInitiallastName라는 세 개의 필드가 포함되어 있다고 가정합니다. Sort 속성을 문자열 "lastName DESC, firstName ASC"로 설정합니다. 이 문자열에 의해 Recordset를 성을 기준으로 내림차순 정렬한 후, 이름을 기준으로 오름차순 정렬합니다. 중간 이니셜은 무시됩니다.

정렬 조건 문자열에서 참조되는 필드의 이름은 "ASC" 또는 "DESC"로 지정할 수 없습니다. 이러한 이름은 ASC 키워드와 충돌하고 DESC . Recordset반환하는 쿼리에서 AS 키워드를 사용하여 이름이 충돌하는 필드에 별칭을 지정합니다.

레코드 집합 필터링에 대한 자세한 내용은 이 항목의 뒷부분에 있는 "결과 필터링"을 참조하세요.

특정 레코드 찾기

ADO는 레코드 집합특정 레코드를 찾기 위한 찾기Seek 메서드를 제공합니다. Find 메서드는 다양한 공급자에서 지원되지만 단일 검색 기준으로 제한됩니다. Seek 메서드는 여러 조건의 검색을 지원하지만 많은 공급자가 지원하지 않습니다.

필드의 인덱스는 Find 메서드뿐만 아니라 SortFilter 속성의 성능도 Recordset 개체에서 크게 향상시킬 수 있습니다. 동적 Optimize 속성을 설정하여 Field 개체에 대한 내부 인덱스 만들 수 있습니다. 이 동적 속성은 CursorLocation 속성을 adUseClient 설정할 때 Field 개체의 Properties 컬렉션에 추가됩니다. 이 인덱스는 ADO 내부이므로 액세스 권한을 얻거나 다른 용도로 사용할 수 없습니다. 또한 이 인덱스는 Recordset 개체의 Index 속성과 다릅니다.

Find 메서드는 Recordset열(필드) 내에서 값을 빠르게 찾습니다. Optimize 속성을 사용하여 열에 인덱스를 생성하면 Find 메서드의 속도를 향상시킬 수 있습니다.

찾기 메서드는 검색을 한 필드의 내용으로 제한합니다. Seek 메서드를 사용하려면 인덱스가 있어야 하며 다른 제한 사항도 있어야 합니다. 인덱스의 기반이 아닌 여러 필드를 검색해야 하거나 공급자가 인덱스를 지원하지 않는 경우 Recordset 개체의 Filter 속성을 사용하여 결과를 제한할 수 있습니다.

찾아내다

Find 메서드는 Recordset 지정된 조건을 충족하는 행을 검색합니다. 필요에 따라 검색의 방향, 시작 행, 시작 행으로부터의 오프셋을 지정할 수 있습니다. 기준이 충족되면 현재 행 위치가 찾은 레코드에 설정됩니다. 그렇지 않으면 위치가 검색 방향에 따라 Recordset끝(또는 시작)으로 설정됩니다.

기준에 대해 단일 열 이름만 지정할 수 있습니다. 즉, 이 메서드는 여러 열 검색을 지원하지 않습니다.

기준에 대한 비교 연산자는 ">" (보다 큼), "<" (보다 작음), "="(같음), ">="(보다 크거나 같음), "<="(작거나 같음), "<>"(같지 않음) 또는 "LIKE"(패턴 일치)일 수 있습니다.

기준 값은 문자열, 부동 소수점 숫자 또는 날짜일 수 있습니다. 문자열 값은 작은따옴표 또는 "#"(숫자 기호) 기호(예: "state = 'WA'" 또는 "state = #WA#")로 구분됩니다. 날짜 값은 "#"(숫자 기호) 표시(예: "start_date > #7/22/97#")로 구분됩니다.

비교 연산자가 "like"이면 문자열 값에 별표(*)가 포함되어 문자나 부분 문자열이 하나 이상 나타나는 것을 찾을 수 있습니다. 예를 들어 "'M*'로 시작하는 주는 메인 및 매사추세츠와 매칭됩니다. 선행 및 후행 별표로 값 내에 포함된 부분 문자열을 찾을 수도 있습니다. 예를 들어 "'*as*'를 포함하는 주 이름은 알래스카, 아칸소, 매사추세츠에 해당됩니다.

앞에 표시된 것처럼 별표는 조건 문자열의 끝에만 사용하거나 조건 문자열의 시작과 끝에서 함께 사용할 수 있습니다. 별표를 선행 와일드카드('*str') 또는 포함된 와일드카드('s*r')로 사용할 수 없습니다. 이로 인해 오류가 발생합니다.

검색 및 인덱스

기본 공급자가 Recordset 개체의 인덱스를 지원하는 경우 Seek 메서드를 Index 속성과 함께 사용합니다. Supports(adSeek) 메서드를 사용하여 기본 공급자가 Seek지원하는지 여부를 확인하고 Supports(adIndex) 메서드를 사용하여 공급자가 인덱스를 지원하는지 여부를 확인합니다. 예를 들어 Microsoft Jet용 OLE DB 공급자Seek인덱스지원합니다.

Seek 원하는 행을 찾지 못하면 오류가 발생하지 않고 행이 Recordset끝에 배치됩니다. 이 메서드를 실행하기 전에 Index 속성을 원하는 인덱스로 설정합니다.

이 메서드는 서버 쪽 커서에서만 지원됩니다. CursorLocation 속성의 값이 adUseClient일 때 Recordset 개체에서는 Seek가 지원되지 않습니다.

이 메서드는 Recordset 개체가 CommandTypeEnum 값으로 adCmdTableDirect상태로 열렸을 때만 사용할 수 있습니다.

결과 필터링

찾기 메서드는 검색을 한 필드의 내용으로 제한합니다. Seek 메서드를 사용하려면 인덱스가 있어야 하며 다른 제한 사항도 있어야 합니다. 인덱스의 기반이 아닌 여러 필드를 검색해야 하거나 공급자가 인덱스를 지원하지 않는 경우 Recordset 개체의 Filter 속성을 사용하여 결과를 제한할 수 있습니다.

Filter 속성을 사용하여 Recordset 개체의 레코드를 선택적으로 차단합니다. 필터링된 레코드 집합 현재 커서가 됩니다. 즉, 필터 조건을 충족하지 않는 레코드는 필터 제거될 때까지 레코드 집합 사용할 수 없습니다. 현재 커서를 기반으로 값을 반환하는 다른 속성(예: AbsolutePosition, AbsolutePage, RecordCountPageCount)이 영향을 받습니다. Filter 속성을 특정 값으로 설정하면 현재 레코드가 새 값을 충족하는 첫 번째 레코드로 이동하기 때문입니다.

Filter 속성은 variant 인수를 사용합니다. 이 값은 Filter 속성을 사용하는 세 가지 방법 중 하나를 나타냅니다. 조건 문자열, FilterGroupEnum 상수 또는 책갈피 배열입니다. 자세한 내용은 이 항목의 뒷부분에 있는 조건 문자열로 필터링, 상수로 필터링 및 책갈피로 필터링을 참조하세요.

메모

선택하려는 데이터를 알고 있는 경우 일반적으로 Filter 속성에 의존하지 않고 결과 집합을 효과적으로 필터링하는 SQL 문으로 Recordset 여는 것이 더 효율적입니다.

Recordset에서 필터를 제거하려면 adFilterNone 상수를 사용하십시오. Filter 속성을 길이가 0인 문자열("")로 설정하면 adFilterNone 상수 사용과 같은 효과가 있습니다.

조건 문자열을 사용하여 필터링

조건 문자열은 FieldName 연산자 값 형식의 절로 구성됩니다 (예: "LastName = 'Smith'"). 개별 절을 AND(예: "LastName = 'Smith' AND FirstName = 'John'") 및 OR(예: "LastName = 'Smith' OR LastName = 'Jones'")과 연결하여 복합 절을 만들 수 있습니다. 조건 문자열에 대해 다음 지침을 사용합니다.

  • FieldName은(는) Recordset의 유효한 필드 이름이어야 합니다. 필드 이름에 공백이 포함된 경우 이름을 대괄호로 묶어야 합니다.

  • 연산자은 다음 중 하나여야 합니다: <, >, ,<=, ,>=, <>, =, 또는 LIKE.

  • 필드 값(예: 'Smith', #8/24/95#, 12.345또는 $50.00)을 비교할 값입니다. 문자열에는 작은따옴표(')를 사용하고, 날짜에는 파운드 기호(#)를 사용합니다. 숫자의 경우 소수점, 달러 기호 및 과학적 표기법을 사용할 수 있습니다. 연산자 LIKE 경우 와일드카드 문자를 사용할 수 있습니다. 별표(*) 및 백분율 기호(%) 와일드카드 문자만 허용되며 문자열의 마지막 문자여야 합니다. null일 수 없습니다.

    메모

    필터 에 작은따옴표 (')를 포함시키려면, 작은따옴표 두 개를 사용하여 하나를 나타내야 합니다. 예를 들어 O'Malley필터링하려면 조건 문자열을 "col1 = 'O''Malley'"합니다. 필터 값의 시작과 끝에 작은따옴표를 포함하려면 문자열을 파운드 기호(#)로 묶습니다. 예를 들어 '1'필터링하려면 조건 문자열을 "col1 = #'1'#"합니다.

ANDOR사이에는 우선 순위가 없습니다. 구문은 괄호 안에 묶을 수 있습니다. 그러나 다음과 같이 OR 조인된 절을 그룹화한 다음 AND를 사용하여 그룹을 다른 절에 조인할 수는 없습니다.

(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'  

대신 다음과 같이 이 필터를 생성합니다.

(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')  

LIKE 절에서는 패턴의 시작과 끝에 와일드카드(예: LastName Like '*mit*')를 사용하거나 패턴의 끝부분에만 와일드카드를 사용할 수 있습니다(예: LastName Like 'Smit*').

상수로 필터링

다음 상수는 레코드 집합을 필터링하는 데 사용할 수 있습니다.

상수 묘사
광고필터영향기록 마지막 Delete, Resync, UpdateBatch, CancelBatch 호출에 영향을 받는 레코드만 보기 위한 필터입니다.
adFilterConflictingRecords 마지막 일괄 업데이트에 실패한 레코드를 보기 위한 필터입니다.
adFilterFetchedRecords 현재 캐시에서 레코드를 보기 위한 필터입니다. 즉, 데이터베이스에서 레코드를 검색하기 위한 마지막 호출의 결과입니다.
adFilterNone 현재 필터를 제거하고 보기 위해 모든 레코드를 복원합니다.
adFilterPendingRecords 변경되었지만 아직 서버로 전송되지 않은 레코드만 보기 위한 필터입니다. 일괄 업데이트 모드에만 적용됩니다.

필터 상수는 다음 예제와 같이 마지막 UpdateBatch 메서드 호출 중에 영향을 받은 레코드만 볼 수 있도록 하여 일괄 업데이트 모드 중에 개별 레코드 충돌을 보다 쉽게 해결할 수 있도록 합니다.

Attribute VB_Name = "modExaminingData"

책갈피를 사용하여 필터링

마지막으로 책갈피의 변형 배열을 Filter 속성에 전달할 수 있습니다. 생성된 커서에는 책갈피가 해당 속성으로 전달된 레코드만 포함됩니다. 다음 코드 예제에서는 ProductName 필드에 "B"가 있는 Recordset 레코드에서 책갈피 배열을 만듭니다. 그런 다음 배열을 Filter 속성에 전달하고 결과 필터링된 Recordset대한 정보를 표시합니다.

'BeginFilterBkmk  
Dim vBkmkArray() As Variant  
Dim i As Integer  
  
'Recordset created using "SELECT * FROM Products" as command.  
'So, we will check to see if ProductName has a capital B, and  
'if so, add to the array.  
i = 0  
Do While Not objRs.EOF  
    If InStr(1, objRs("ProductName"), "B") Then  
        ReDim Preserve vBkmkArray(i)  
        vBkmkArray(i) = objRs.Bookmark  
        i = i + 1  
        Debug.Print objRs("ProductName")  
    End If  
    objRs.MoveNext  
Loop  
  
'Filter using the array of bookmarks.  
objRs.Filter = vBkmkArray  
  
objRs.MoveFirst  
Do While Not objRs.EOF  
    Debug.Print objRs("ProductName")  
    objRs.MoveNext  
Loop  
'EndFilterBkmk  

레코드 집합의 복제본 만들기

Clone 메서드를 사용하여 여러 개의 중복 Recordset 개체를 만들 수 있습니다. 특히 지정된 레코드 집합에서 현재 레코드를 두 개 이상 유지하려는 경우 더욱 그렇습니다. Clone 메서드를 사용하면 원본과 동일한 정의를 사용하여 새 Recordset 개체를 만들고 여는 것보다 더 효율적입니다.

새로 만든 클론의 현재 레코드는 원래 첫 번째 레코드로 설정됩니다. 복제된 Recordset 현재 레코드 포인터는 원본과 동기화되지 않거나 그 반대의 경우도 마찬가지입니다. 각 레코드 집합을 독립적으로 탐색할 수 있습니다.

Recordset 개체 하나에 대한 변경 내용은 커서 유형에 관계없이 모든 클론에 표시됩니다. 원래 RecordsetRequery을 실행하면 클론은 더 이상 원본과 동기화되지 않습니다.

원본 Recordset을 닫아도 그 복사본들이 닫히지 않으며, 복사본을 닫아도 원본이나 다른 복사본이 닫히지 않습니다.

책갈피를 지원하는 경우에만 Recordset 개체를 복제할 수 있습니다. 책갈피 값은 서로 바꿔서 사용할 수 있습니다. 즉, 한 Recordset 개체의 책갈피 참조는 해당 클론에서 동일한 레코드를 참조합니다.