다음을 통해 공유


CRecordset::Open

 

게시: 2016년 4월

테이블을 검색하거나 레코드 집합이 표현하는 쿼리를 수행하여 레코드 집합을 엽니다.

구문

      virtual BOOL Open( 
   UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE, 
   LPCTSTR lpszSQL = NULL, 
   DWORD dwOptions = none  
);

매개 변수

  • nOpenType
    기본 값인 AFX_DB_USE_DEFAULT_TYPE, 또는 다음 OpenType 열거형에서 하나의 값을 사용합니다.

    • CRecordset::dynaset 양방향 스크롤을 가진 레코드 집합입니다. 레코드 집합을 열 때, 멤버 자격과 레코드의 순서가 결정됩니다. 그러나 다른 사용자에 의해 변경된 데이터 값은 다음 반입 작업에서 볼 수 있습니다. 다이너셋은 keyset-driven 레코드 집합이라고도 알려져 있다.

    • CRecordset::snapshot 양방향 스크롤링을 사용하는 정적 레코드 집합. 레코드 집합을 열 때, 멤버 자격과 레코드의 순서가 결정됩니다. 데이터 값은 해당 레코드가 반입될 때 결정됩니다. 레코드 집합을 닫고 다시 열 때까지는 다른 사용자가 변경한 내용이 표시되지 않습니다.

    • CRecordset::dynamic 양방향 스크롤을 가진 레코드 집합입니다. 다른 이용자에 의해 변경된 멤버 자격, 순서 및 데이터 값은 다음 반입 작업에 표시됩니다. 많은 ODBC 드라이버가 이러한 형식의 레코드 집합을 지원하지 않는다는 사실에 주의하십시오.

    • CRecordset::forwardOnly 정방향 스크롤만 사용하는 읽기 전용 레코드 집합입니다.

      CRecordset의 기본값은 CRecordset::snapshot입니다. 기본값 메커니즘은 Visual C++ 마법사가 서로 다른 기본값을 가진 ODBC CRecordset와 DAO CDaoRecordset가 서로 상호 작용할 수 있도록 허용합니다.

    이러한 레코드 집합 형식에 대한 자세한 내용은 레코드 집합 (ODBC) 문서를 참조하십시오. 관련된 정보는 Windows SDK의 "블록 및 스크롤 가능한 커서의 사용" 문서를 참조하십시오.

    경고

    요청된 형식이 지원되지 않는다면, 프레임워크는 예외를 던집니다.

  • lpszSQL
    문자열 포인터는 다음 중 하나를 포함하고 있습니다.

    • NULL 포인터.

    • 테이블의 이름입니다.

    • SELECT SQL문 (선택적으로 WHERE 또는 ORDER BY 절을 포함한 SQL문).

    • CALL문은 미리 정의된 쿼리(저장 프로시저)의 이름을 지정합니다. CALL 키워드와 중괄호 사이에 공백을 넣지 않도록 주의해야 합니다.

    이 문자열에 대한 추가 정보는 주의에서 테이블 및 설명의 클래스 마법사 역할에 대한 설명을 참조하십시오.

    참고

    결과 집합의 열 순서는 RFX 또는 재정의된 DoFieldExchange 혹은 DoBulkFieldExchange 함수의 대량 RFX 함수 호출 순서와 일치해야 합니다.

  • dwOptions
    아래 나열된 값의 조합을 지정할 수 있는 비트마스크입니다. 이들 중 일부는 상호 배타적입니다. 기본값은 none입니다.

    • CRecordset::none 옵션 집합이 없습니다. 이 매개 변수 값은 다른 모든 값과 상호 배타적입니다. 기본적으로 편집 또는 삭제를 사용하여 레코드 집합을 업데이트할 수 있으며, 새로 만들기를 이용하여 새로운 레코드를 추가할 수 있습니다. 데이터 소스의 업데이트 가능성은 지정된 nOpenType 옵션과 데이터 소스에 의존합니다. 대량 추가에 대한 최적화를 사용할 수 없는 경우 대량 행 반입이 구현되지 않습니다. 삭제된 레코드는 레코드 집합을 탐색하는 동안 건너뛰어지지 않습니다. 책갈피는 사용할 수 없습니다. 더티 필드 자동 확인이 구현됩니다.

    • CRecordset::appendOnly 레코드 집합에서의 편집 또는 삭제는 허용되지 않습니다. AddNew만 허용합니다. 이 옵션은 CRecordset::readOnly와 상호 배타적입니다.

    • CRecordset::readOnly 레코드 집합을 읽기 전용으로 엽니다. 이 옵션은 CRecordset::readOnly와 상호 배타적입니다.

    • CRecordset::optimizeBulkAdd 한 번에 여러 레코드를 추가하는 것에 최적화된 SQL문을 사용합니다. SQLSetPos는 레코드 집합을 업데이트할 때에 ODBC API 함수를 사용하지 않는 경우에만 적용됩니다. 첫 번째 업데이트는 더티로 표시된 필드를 결정합니다. 이 설정은 CRecordset::useMultiRowFetch와 상호 배타적입니다.

    • CRecordset::useMultiRowFetch 단일 반입 작업에서 여러 행을 검색하도록 허용하는 대량 행 반입을 구현합니다. 이것은 성능 향상을 위해 설계된 고급 기능입니다; 그러나 대량 레코드 필드 교환은 클래스 마법사에서 지원되지 않습니다. 이 옵션은 CRecordset::optimizeBulkAdd와 상호 배타적입니다. CRecordset::useMultiRowFetch를 지정한 경우, CRecordset::noDirtyFieldCheck 옵션이 자동적으로 켜지는 것을 주의하십시오. (이중 버퍼링은 사용할 수 없습니다); 앞으로만 이동 가능한 레코드 집합에서, CRecordset::useExtendedFetch 옵션은 자동으로 켜집니다. 대량 행 반입에 대한 자세한 내용은 레코드 집합: 대량 레코드 반입(ODBC) 문서를 참조하십시오.

    • CRecordset::skipDeletedRecords 레코드 집합을 탐색할 때 삭제된 모든 레코드를 건너뜁니다. 이것은 관련된 특정 반입 작업의 성능을 느리게 만듭니다. 이 옵션은 앞으로만 이동 가능한 레코드 집합과에 유효하지 않습니다. nRows 매개 변수를 0으로 설정하고 CRecordset::skipDeletedRecords 옵션을 설정하여 이동을 호출하는 경우, 이동은 어설션됩니다. CRecordset::skipDeletedRecords드라이버 압축과 레코드 집합에서 삭제된 행을 제거한다는 점이 유사하다는 것을 유의해야 합니다. 그러나, 드라이버 팩 레코드는 현재 이용자가 삭제한 레코드만 건너뜁니다; 레코드 집합이 열려있는 동안 다른 이용자에 의해 삭제된 레코드는 건너뛰지 않습니다. CRecordset::skipDeletedRecords는 다른 이용자에 의해 삭제된 행을 건너뜁니다.

    • CRecordset::useBookmarks 지원 되는 경우, 레코드 집합에 책갈피를 사용할 수 있습니다. 책갈피는 데이터 검색 속도를 느리게 하지만 데이터 탐색에 대한 성능을 향상시킵니다. 앞으로만 이동 가능한 레코드 집합에서는 사용할 수 없습니다. 자세한 내용은 레코드 집합: 책갈피와 절대 위치(ODBC) 문서를 참조하십시오.

    • CRecordset::noDirtyFieldCheck 더티 필드 자동 검사(이중 버퍼링)를 해제합니다. 이는 성능을 향상시킵니다; 그러나, 더티 필드를 SetFieldDirtySetFieldNull 멤버 함수를 통해 수동으로 표시해야 합니다. CRecordset 클래스에서의 이중 버퍼링은 CDaoRecordset와 유사하다는 사실에 유의하십시오. 그러나 CRecordset에서는 개별 필드에 이중 버퍼링을 사용할 수 없습니다; 모든 필드에 대해서 사용하도록 설정하거나 모든 필드에 대해서 사용하지 않도록 설정해야 합니다. CRecordset::useMultiRowFetch 옵션을 지정하는 경우, CRecordset::noDirtyFieldCheck가 자동적으로 켜진다는 점을 유의하십시오; 그러나, SetFieldDirtySetFieldNull은 레코드 집합에서 대량 행 반입을 구현하기 위하여 사용될 수 없습니다.

    • CRecordset::executeDirect 준비된 SQL문을 사용하지 마십시오. 재질의 멤버 함수가 결코 호출되지 않는다면 성능을 향상시키기 위하여 이 옵션을 지정하십시오.

    • CRecordset::useExtendedFetch SQLExtendedFetch 대신 SQLFetch를 구현합니다. 이것은 앞으로만 이동 가능한 레코드 집합에 대량 행 반입을 구현하기 위해 설계되었습니다. 앞으로만 이동 가능한 레코드 집합에 CRecordset::useMultiRowFetch 옵션을 지정하면, CRecordset::useExtendedFetch이 자동으로 켜집니다.

    • CRecordset::userAllocMultiRowBuffers 데이터를 위한 저장소 버퍼를 할당합니다. 자신의 저장소를 할당하고 싶다면 결합에 이 옵션과 CRecordset::useMultiRowFetch를 사용하십시오; 그렇지 않으면 프레임워크는 자동적으로 필수 저장소를 할당합니다. 자세한 내용은 레코드 집합: 대량 레코드 반입(ODBC) 문서를 참조하십시오. CRecordset::useMultiRowFetch를 지정하지 않고 CRecordset::userAllocMultiRowBuffers를 지정하는 것은 실패한 어설션을 발생시킨다는 점에 유의하십시오.

반환 값

CRecordset 개체를 성공적으로 열었을 경우 0이 아닌 값을 반환합니다; 그렇지 않으면 CDatabase::Open은 (만약 호출되었을 경우) 0을 반환합니다.

설명

레코드 집합에 의해 정의된 질의를 실행하기 위해서는 이 멤버 함수를 호출해야 합니다. 열기를 호출하기 전에, 레코드 집합 개체를 생성해야 합니다.

이 레코드 집합과 데이터 소스의 연결은 열기를 호출하기 이전에 어떻게 레코드 집합이 생성되었는지에 따라 달라집니다. CDatabase 개체를 데이터 소스와 연결되지 않는 레코드 집합 생성자에게 전달하는 경우, 데이터베이스 개체를 열기 위해 이 멤버 함수는 GetDefaultConnect를 사용합니다. NULL값을 레코드 집합 생성자에게 전달하는 경우, 생성자는 CDatabase 개체를 생성하고, 데이터베이스 개체에 연결을 시도하기 위해 열기를 수행합니다. 다양한 환경에서의 레코드 집합 연결 및 닫기에 대한 자세한 내용은 닫기 문서를 참조하십시오.

참고

CRecordset 개체를 통한 데이터 소스에 대한 액세스는 항상 공유됩니다.CDaoRecordset 클래스와는 다르게, 데이터 소스를 배타적으로 접근하기 위하여 CRecordset 개체를 사용할 수 없습니다.

열기를 호출하는 경우, 일반적으로 SELECT SQL문을 이용한 질의는 다음 표의 기준에 따라 레코드를 선택합니다.

lpszSQL 매개 변수의 값

선택한 레코드는 다음에 의해 결정됩니다.

예제

NULL

GetDefaultSQL에서 반환된 문자열.

 

SQL 테이블 이름

DoFieldExchange 또는 DoBulkFieldExchange의 테이블 목록 내 모든 열.

"Customer"

미리 정의된 질의 (저장된 프로시저) 이름

반환하도록 정의된 질의의 열.

"{call OverDueAccts}"

SELECT 열 목록 FROM 테이블 목록

지정된 테이블의 지정된 열.

"SELECT CustId, CustName FROM

Customer"

경고

SQL 문자열에서 여분의 공백을 삽입하지 않도록 주의하십시오.예를 들어, 중괄호와 CALL 키워드 사이에 공백을 삽입한다면, MFC는 SQL 문자열을 테이블 이름으로 잘못 해석하여 SELECT문에 통합하며, 이는 예외를 발생시킵니다.마찬가지로, 출력 매개 변수를 사용하는 미리 정의된 질의를 사용하는 경우, 중괄호 사이와 '?' 기호 사이에 공백을 넣지 마십시오.마지막으로, 중괄호와 CALL문 혹은 SELECT문의 SELECT 키워드 사이에 공백을 넣지 마십시오.

일반적인 절차는 NULL값을 열기에 전달하는 것입니다; 이 경우, 열기GetDefaultSQL을 호출합니다. 파생된 CRecordset 클래스를 사용하는 경우, GetDefaultSQL은 클래스 마법사에서 지정한 테이블 이름을 돌려줍니다. 대신에 lpszSQL매개 변수에서 다른 정보를 지정할 수 있습니다.

어떠한 값을 전달하더라도, 열기 생성자는 질의에 대한 최종적인 SQL 문자열을 생성합니다 (문자열은 전달한 lpszSQL 문자열에 포함된 WHEREORDER BY 절 SQL을 포함할 수 있습니다). 열기를 호출한 이후에 GetSQL를 호출하여 생성된 문자열을 검사할 수 있습니다. 레코드 집합이 어떻게 SQL문을 생성하고 레코드를 선택하는지에 대한 자세한 내용은 레코드 집합: 레코드 집합의 레코드 선택 방법 (ODBC) 문서를 참조하십시오.

레코드 집합의 필드 데이터 멤버는 선택된 데이터와 연결됩니다. 레코드가 반환되는 경우, 첫 번째 레코드가 현재 레코드가 됩니다.

레코드 집합에서 필터나 정렬 옵션 등을 설정하기를 원하는 경우, 레코드 집합 개체를 생성한 이후 열기를 호출하기 전에 이들을 지정하십시오. 레코드 집합이 이미 열려 있는 상태에서 레코드 집합의 레코드를 새로 고칠 경우, 재질의을 호출하십시오.

추가 예제를 비롯한 자세한 내용은 레코드 집합 (ODBC), 레코드 집합: 레코드 집합의 레코드 선택 방법 (ODBC)레코드 집합: 집합 만들기 및 닫기 레코드 집합 (ODBC) 문서를 참조하십시오.

예외

Exception

Condition

이 메서드는 CDBException*CMemoryException* 형식의 예외를 던질 수 있습니다.

예제

다음 코드 예제는 열기 호출의 여러가지 형태를 보여줍니다.

// rsSnap, rsLName, and rsDefault are CRecordset or CRecordset-derived 
// objects

// Open rs using the default SQL statement, implement bookmarks, and turn 
// off automatic dirty field checking
rsSnap.Open(CRecordset::snapshot, NULL, CRecordset::useBookmarks | 
   CRecordset::noDirtyFieldCheck);

// Pass a complete SELECT statement and open as a dynaset
rsLName.Open(CRecordset::dynaset, _T("Select L_Name from Customer"));

// Accept all defaults
rsDefault.Open();

요구 사항

헤더: afxdb.h

참고 항목

CRecordset Class
계층 구조 차트
CRecordset::CRecordset
CRecordset::Close
CRecordset::GetDefaultSQL
CRecordset::GetSQL
CRecordset::m_strFilter
CRecordset::m_strSort
CRecordset::Requery