CRecordset
클래스
데이터 소스에서 선택한 레코드 집합을 나타냅니다.
구문
class CRecordset : public CObject
멤버
Public 생성자
속성 | 설명 |
---|---|
CRecordset::CRecordset |
CRecordset 개체를 생성합니다. 파생 클래스는 이 클래스를 호출하는 생성자를 제공해야 합니다. |
공용 메서드
이름 | 설명 |
---|---|
CRecordset::AddNew |
새 레코드 추가를 준비합니다. 추가를 완료하려면 호출 Update 합니다. |
CRecordset::CanAppend |
멤버 함수를 통해 레코드 집합에 새 레코드를 추가할 수 있으면 0이 아닌 값을 AddNew 반환합니다. |
CRecordset::CanBookmark |
레코드 집합이 책갈피를 지원하는 경우 0이 아닌 값을 반환합니다. |
CRecordset::Cancel |
두 번째 스레드에서 비동기 작업 또는 프로세스를 취소합니다. |
CRecordset::CancelUpdate |
작업 Edit 으로 인해 AddNew 보류 중인 업데이트를 취소합니다. |
CRecordset::CanRestart |
레코드 집합의 쿼리를 다시 실행하기 위해 호출할 수 있는 경우 Requery 0이 아닌 값을 반환합니다. |
CRecordset::CanScroll |
레코드를 스크롤할 수 있으면 0이 아닌 값을 반환합니다. |
CRecordset::CanTransact |
데이터 원본이 트랜잭션을 지원하는 경우 0이 아닌 값을 반환합니다. |
CRecordset::CanUpdate |
레코드 집합을 업데이트할 수 있으면 0이 아닌 값을 반환합니다(레코드를 추가, 업데이트 또는 삭제할 수 있습니다). |
CRecordset::CheckRowsetError |
레코드를 가져오는 동안 생성된 오류를 처리하기 위해 호출됩니다. |
CRecordset::Close |
레코드 집합과 연결된 ODBC HSTMT 를 닫습니다. |
CRecordset::Delete |
레코드 집합에서 현재 레코드를 삭제합니다. 삭제 후 다른 레코드로 명시적으로 스크롤해야 합니다. |
CRecordset::DoBulkFieldExchange |
데이터 원본에서 레코드 집합으로 대량 데이터 행을 교환하기 위해 호출됩니다. 대량 레코드 필드 교환(Bulk RFX)을 구현합니다. |
CRecordset::DoFieldExchange |
레코드 집합의 필드 데이터 멤버와 데이터 원본의 해당 레코드 간에 양방향으로 데이터를 교환하기 위해 호출됩니다. RFX(레코드 필드 교환)를 구현합니다. |
CRecordset::Edit |
현재 레코드의 변경 내용을 준비합니다. 편집을 완료하려면 호출 Update 합니다. |
CRecordset::FlushResultSet |
미리 정의된 쿼리를 사용할 때 검색할 다른 결과 집합이 있는 경우 0이 아닌 값을 반환합니다. |
CRecordset::GetBookmark |
매개 변수 개체에 레코드의 책갈피 값을 할당합니다. |
CRecordset::GetDefaultConnect |
기본 연결 문자열 가져오기 위해 호출됩니다. |
CRecordset::GetDefaultSQL |
실행할 기본 SQL 문자열을 가져오기 위해 호출됩니다. |
CRecordset::GetFieldValue |
레코드 집합에 있는 필드의 값을 반환합니다. |
CRecordset::GetODBCFieldCount |
레코드 집합의 필드 수를 반환합니다. |
CRecordset::GetODBCFieldInfo |
레코드 집합의 필드에 대한 특정 종류의 정보를 반환합니다. |
CRecordset::GetRecordCount |
레코드 집합의 레코드 수를 반환합니다. |
CRecordset::GetRowsetSize |
단일 인출 중에 검색하려는 레코드 수를 반환합니다. |
CRecordset::GetRowsFetched |
인출하는 동안 검색된 실제 행 수를 반환합니다. |
CRecordset::GetRowStatus |
인출 후 행의 상태를 반환합니다. |
CRecordset::GetSQL |
레코드 집합에 대한 레코드를 선택하는 데 사용되는 SQL 문자열을 가져옵니다. |
CRecordset::GetStatus |
레코드 집합의 상태( 현재 레코드의 인덱스 및 레코드의 최종 개수를 얻었는지 여부)를 가져옵니다. |
CRecordset::GetTableName |
레코드 집합의 기반이 되는 테이블의 이름을 가져옵니다. |
CRecordset::IsBOF |
레코드 집합이 첫 번째 레코드 앞에 배치된 경우 0이 아닌 값을 반환합니다. 현재 레코드가 없습니다. |
CRecordset::IsDeleted |
레코드 집합이 삭제된 레코드에 배치된 경우 0이 아닌 값을 반환합니다. |
CRecordset::IsEOF |
레코드 집합이 마지막 레코드 뒤의 위치에 있으면 0이 아닌 값을 반환합니다. 현재 레코드가 없습니다. |
CRecordset::IsFieldDirty |
현재 레코드의 지정된 필드가 변경된 경우 0이 아닌 값을 반환합니다. |
CRecordset::IsFieldNull |
현재 레코드의 지정된 필드가 null(값 없음)이면 0이 아닌 값을 반환합니다. |
CRecordset::IsFieldNullable |
현재 레코드의 지정된 필드를 null(값 없음)로 설정할 수 있으면 0이 아닌 값을 반환합니다. |
CRecordset::IsOpen |
이전에 호출된 경우 Open 0이 아닌 값을 반환합니다. |
CRecordset::Move |
레코드 집합을 현재 레코드에서 지정된 수의 레코드로 어느 방향으로든 배치합니다. |
CRecordset::MoveFirst |
레코드 집합의 첫 번째 레코드에 현재 레코드를 배치합니다. 먼저 테스트합니다 IsBOF . |
CRecordset::MoveLast |
마지막 레코드 또는 마지막 행 집합에 현재 레코드를 배치합니다. 먼저 테스트합니다 IsEOF . |
CRecordset::MoveNext |
현재 레코드를 다음 레코드 또는 다음 행 집합에 배치합니다. 먼저 테스트합니다 IsEOF . |
CRecordset::MovePrev |
이전 레코드 또는 이전 행 집합에 현재 레코드를 배치합니다. 먼저 테스트합니다 IsBOF . |
CRecordset::OnSetOptions |
지정된 ODBC 문에 대한 옵션(선택 시 사용)을 설정하기 위해 호출됩니다. |
CRecordset::OnSetUpdateOptions |
지정된 ODBC 문에 대한 옵션(업데이트 시 사용)을 설정하기 위해 호출됩니다. |
CRecordset::Open |
테이블을 검색하거나 레코드 집합이 나타내는 쿼리를 수행하여 레코드 집합을 엽니다. |
CRecordset::RefreshRowset |
지정된 행의 데이터와 상태를 새로 고칩니다. |
CRecordset::Requery |
레코드 집합의 쿼리를 다시 실행하여 선택한 레코드를 새로 고칩니다. |
CRecordset::SetAbsolutePosition |
레코드 집합을 지정된 레코드 번호에 해당하는 레코드에 배치합니다. |
CRecordset::SetBookmark |
책갈피로 지정된 레코드에 레코드 집합을 배치합니다. |
CRecordset::SetFieldDirty |
현재 레코드의 지정된 필드를 변경된 것으로 표시합니다. |
CRecordset::SetFieldNull |
현재 레코드에서 지정된 필드의 값을 null(값 없음)로 설정합니다. |
CRecordset::SetLockingMode |
잠금 모드를 "낙관적" 잠금(기본값) 또는 "비관적" 잠금으로 설정합니다. 업데이트를 위해 레코드가 잠기는 방법을 결정합니다. |
CRecordset::SetParamNull |
지정된 매개 변수를 null로 설정합니다(값 없음). |
CRecordset::SetRowsetCursorPosition |
행 집합 내의 지정된 행에 커서를 놓습니다. |
CRecordset::SetRowsetSize |
인출하는 동안 검색할 레코드 수를 지정합니다. |
CRecordset::Update |
데이터 원본에 AddNew 새 데이터 또는 편집된 데이터를 저장하여 또는 Edit 작업을 완료합니다. |
공용 데이터 멤버
속성 | 설명 |
---|---|
CRecordset::m_hstmt |
레코드 집합에 대한 ODBC 문 핸들을 포함합니다. HSTMT . |
CRecordset::m_nFields |
레코드 집합의 필드 데이터 멤버 수를 포함합니다. UINT . |
CRecordset::m_nParams |
레코드 집합의 매개 변수 데이터 멤버 수를 포함합니다. UINT . |
CRecordset::m_pDatabase |
레코드 집합이 데이터 원본에 CDatabase 연결된 개체에 대한 포인터를 포함합니다. |
CRecordset::m_strFilter |
CString SQL(구조적 쿼리 언어) WHERE 절을 지정하는 a를 포함합니다. 필터로 사용하여 특정 조건을 충족하는 레코드만 선택합니다. |
CRecordset::m_strSort |
SQL ORDER BY 절을 CString 지정하는 a를 포함합니다. 레코드 정렬 방법을 제어하는 데 사용됩니다. |
설명
"레코드 집합"이라고 CRecordset
하는 개체는 일반적으로 다이나셋과 스냅샷의 두 가지 형태로 사용됩니다. 다이내셋은 다른 사용자가 수행한 데이터 업데이트와 동기화된 상태로 유지됩니다. 스냅샷은 데이터의 정적 뷰입니다. 각 양식은 레코드 집합이 열릴 때 고정된 레코드 집합을 나타냅니다. 다이나셋의 레코드로 스크롤하면 다른 사용자 또는 애플리케이션의 다른 레코드 집합에 의해 레코드가 변경된 내용이 반영됩니다.
참고 항목
ODBC(Open Database Connectivity) 클래스 대신 DAO(Data Access Objects) 클래스를 사용하는 경우 대신 클래스 CDaoRecordset
를 사용합니다. 자세한 내용은 개요: 데이터베이스 프로그래밍을 참조 하세요.
두 종류의 레코드 집합을 사용하려면 일반적으로 애플리케이션별 레코드 집합 클래스 CRecordset
를 파생합니다. 레코드 집합은 데이터 원본에서 레코드를 선택하고 다음을 수행할 수 있습니다.
레코드를 스크롤합니다.
레코드를 업데이트하고 잠금 모드를 지정합니다.
데이터 원본에서 사용할 수 있는 레코드 중에서 선택한 레코드를 제한하도록 레코드 집합을 필터링합니다.
레코드 집합을 정렬합니다.
레코드 집합을 매개 변수화하여 런타임까지 알려지지 않은 정보를 사용하여 선택 항목을 사용자 지정합니다.
클래스를 사용하려면 데이터베이스를 열고 레코드 집합 개체를 생성하여 생성자에 포인터를 개체에 CDatabase
전달합니다. 그런 다음, 개체가 다이너셋인지 스냅샷인지 지정할 수 있는 레코드 집합의 Open
멤버 함수를 호출합니다. 호출 Open
은 데이터 원본에서 데이터를 선택합니다. 레코드 집합 개체를 연 후 해당 멤버 함수 및 데이터 멤버를 사용하여 레코드를 스크롤하고 해당 함수에서 작동합니다. 사용 가능한 작업은 개체가 다이너셋인지 스냅샷인지, 업데이트 가능한지 읽기 전용인지 여부(ODBC(Open Database Connectivity) 데이터 원본의 기능에 따라 달라지거나 대량 행 가져오기를 구현했는지 여부에 따라 달라집니다. 호출 후 변경되거나 추가되었을 수 있는 레코드를 Open
새로 고치려면 개체의 Requery
멤버 함수를 호출합니다. 개체의 Close
멤버 함수를 호출하고 완료하면 개체를 삭제합니다.
파생 CRecordset
클래스에서 레코드 필드 교환(RFX) 또는 대량 레코드 필드 교환(Bulk RFX)은 레코드 필드 읽기 및 업데이트를 지원하는 데 사용됩니다.
레코드 집합 및 레코드 필드 교환에 대한 자세한 내용은 개요: 데이터베이스 프로그래밍, 레코드 집합(ODBC), 레코드 집합: 대량 레코드 가져오기(ODBC) 및 RFX(레코드 필드 교환) 문서를 참조하세요. 다이내셋 및 스냅샷에 대한 포커스는 Dynaset 및 스냅샷 문서를 참조하세요.
상속 계층
CRecordset
요구 사항
머리글: afxdb.h
CRecordset::AddNew
테이블에 새 레코드를 추가할 준비를 합니다.
virtual void AddNew();
설명
새로 추가된 레코드를 Requery
보려면 멤버 함수를 호출해야 합니다. 레코드의 필드는 처음에 Null입니다. (데이터베이스 용어에서 Null은 "값 없음"을 의미하며 C++의 NULL과 동일하지 않습니다. 작업을 완료하려면 멤버 함수를 Update
호출해야 합니다. Update
는 변경 내용을 데이터 원본에 저장합니다.
참고 항목
대량 행 페치를 구현한 경우 호출 AddNew
할 수 없습니다. 이로 인해 어설션이 실패합니다. 클래스 CRecordset
는 대량 데이터 행을 업데이트하는 메커니즘을 제공하지 않지만 ODBC API SQLSetPos
함수를 사용하여 고유한 함수를 작성할 수 있습니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
AddNew
는 레코드 집합의 필드 데이터 멤버를 사용하여 비어 있는 새 레코드를 준비합니다. 호출 AddNew
한 후 레코드 집합의 필드 데이터 멤버에서 원하는 값을 설정합니다. (다음을 호출 할 필요가 없습니다.이 용도로 멤버 함수를 편집 합니다. 기존 레코드에만 사용합니다 Edit
.) 호출 Update
하면 필드 데이터 멤버의 변경된 값이 데이터 원본에 저장됩니다.
주의
호출 Update
하기 전에 새 레코드로 스크롤하면 새 레코드가 손실되고 경고가 표시되지 않습니다.
데이터 원본이 트랜잭션을 지원하는 경우 호출을 트랜잭션의 일부로 만들 AddNew
수 있습니다. 트랜잭션에 대한 자세한 내용은 클래스를 참조하세요 CDatabase
. 를 호출하기 전에 호출 CDatabase::BeginTrans
AddNew
합니다.
참고 항목
다이내셋의 경우 새 레코드가 마지막 레코드로 레코드 집합에 추가됩니다. 추가된 레코드는 스냅샷에 추가되지 않습니다. 레코드 집합을 새로 고치려면 호출 Requery
해야 합니다.
멤버 함수가 호출되지 않은 레코드 집합 Open
을 호출 AddNew
하는 것은 불법입니다. 추가할 수 없는 레코드 집합을 호출 AddNew
하면 A CDBException
가 throw됩니다. 를 호출 CanAppend
하여 레코드 집합을 업다이트할 수 있는지 여부를 확인할 수 있습니다.
자세한 내용은 레코드 집합: 레코드 집합 ODBC(레코드 집합 업데이트) 방법, 레코드 집합: 레코드 추가, 업데이트 및 삭제(ODBC) 및 트랜잭션(ODBC)을 참조하세요.
예시
참조 트랜잭션: 레코드 집합에서 트랜잭션 수행(ODBC).
CRecordset::CanAppend
이전에 연 레코드 집합에서 새 레코드를 추가할 수 있는지 여부를 결정합니다.
BOOL CanAppend() const;
반환 값
레코드 집합에서 새 레코드를 추가할 수 있는 경우 0이 아닌 경우 그렇지 않으면 0입니다. CanAppend
는 레코드 집합을 읽기 전용으로 연 경우 0을 반환합니다.
CRecordset::CanBookmark
레코드 집합에서 책갈피를 사용하여 레코드를 표시할 수 있는지 여부를 결정합니다.
BOOL CanBookmark() const;
반환 값
레코드 집합이 책갈피를 지원하는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
이 함수는 멤버 함수의 매개 변수에 있는 dwOptions
옵션과 Open
독립적 CRecordset::useBookmarks
입니다. CanBookmark
는 지정된 ODBC 드라이버 및 커서 유형이 책갈피를 지원하는지 여부를 나타냅니다. CRecordset::useBookmarks
은 지원되는 경우 책갈피를 사용할 수 있는지 여부를 나타냅니다.
참고 항목
책갈피는 전달 전용 레코드 집합에서 지원되지 않습니다.
책갈피 및 레코드 집합 탐색에 대한 자세한 내용은 Recordset: ODBC(책갈피 및 절대 위치) 및 레코드 집합: 스크롤(ODBC) 문서를 참조하세요.
CRecordset::Cancel
데이터 원본이 진행 중인 비동기 작업 또는 두 번째 스레드의 프로세스를 취소할 것을 요청합니다.
void Cancel();
설명
MFC ODBC 클래스는 더 이상 비동기 처리를 사용하지 않습니다. 비동기 작업을 수행하려면 ODBC API 함수 SQLSetConnectOption
를 직접 호출해야 합니다. 자세한 내용은 ODBC SDK 프로그래머 가이드의 "함수 비동기 실행"을 참조하세요.
CRecordset::CancelUpdate
호출되기 전에 Update
작업 또는 AddNew
작업으로 인해 Edit
보류 중인 업데이트를 취소합니다.
void CancelUpdate();
설명
참고 항목
이러한 레코드 집합을 호출Edit
AddNew
할 수 없으므로 대량 행 가져오기를 사용하는 레코드 집합에는 Update
이 멤버 함수를 적용할 수 없습니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
자동 더티 필드 검사를 사용하는 CancelUpdate
경우 멤버 변수를 이전 Edit
또는 AddNew
호출된 값으로 복원합니다. 그렇지 않으면 값 변경 내용이 유지됩니다. 기본적으로 레코드 집합을 열 때 자동 필드 검사가 활성화됩니다. 사용하지 않도록 설정하려면 Open 멤버 함수의 dwOptions
매개 변수에서 지정 CRecordset::noDirtyFieldCheck
해야 합니다.
데이터 업데이트에 대한 자세한 내용은 레코드 집합: 레코드 추가, 업데이트 및 삭제(ODBC)를 참조하세요.
CRecordset::CanRestart
레코드 집합에서 멤버 함수를 호출 Requery
하여 쿼리를 다시 시작할 수 있는지(레코드를 새로 고칠 수 있는지) 여부를 결정합니다.
BOOL CanRestart() const;
반환 값
다시 쿼리가 허용되는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
CRecordset::CanScroll
레코드 집합에서 스크롤을 허용하는지 여부를 결정합니다.
BOOL CanScroll() const;
반환 값
레코드 집합에서 스크롤을 허용하는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
스크롤 에 대한 자세한 내용은 레코드 집합: 스크롤(ODBC)을 참조하세요.
CRecordset::CanTransact
레코드 집합에서 트랜잭션을 허용하는지 여부를 결정합니다.
BOOL CanTransact() const;
반환 값
레코드 집합에서 트랜잭션을 허용하는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
자세한 내용은 트랜잭션(ODBC)을 참조하세요.
CRecordset::CanUpdate
레코드 집합을 업데이트할 수 있는지 여부를 결정합니다.
BOOL CanUpdate() const;
반환 값
레코드 집합을 업데이트할 수 있는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
기본 데이터 원본이 읽기 전용이거나 레코드 집합을 열 때 매개 변수에 dwOptions
지정한 CRecordset::readOnly
경우 레코드 집합은 읽기 전용일 수 있습니다.
CRecordset::CheckRowsetError
레코드를 가져오는 동안 생성된 오류를 처리하기 위해 호출됩니다.
virtual void CheckRowsetError(RETCODE nRetCode);
매개 변수
nRetCode
ODBC API 함수는 코드를 반환합니다. 자세한 내용은 설명을 참조하세요.
설명
이 가상 멤버 함수는 레코드를 가져올 때 발생하는 오류를 처리하며 대량 행을 가져오는 동안 유용합니다. 사용자 고유의 오류 처리를 구현하도록 재정의하는 CheckRowsetError
것이 좋습니다.
CheckRowsetError
는 커서 탐색 작업(예: Open
또는 Requery
모든 Move
작업)에서 자동으로 호출됩니다. ODBC API 함수 SQLExtendedFetch
의 반환 값이 전달됩니다. 다음 표에서는 매개 변수에 사용할 수 있는 값을 나열합니다 nRetCode
.
nRetCode | 설명 |
---|---|
SQL_SUCCESS |
함수가 성공적으로 완료되었습니다. 사용할 수 있는 추가 정보가 없습니다. |
SQL_SUCCESS_WITH_INFO |
함수가 성공적으로 완료되었으며 심각하지 않은 오류가 있을 수 있습니다. 를 호출 SQLError 하여 추가 정보를 가져올 수 있습니다. |
SQL_NO_DATA_FOUND |
결과 집합의 모든 행을 가져왔습니다. |
SQL_ERROR |
함수가 실패했습니다. 를 호출 SQLError 하여 추가 정보를 가져올 수 있습니다. |
SQL_INVALID_HANDLE |
잘못된 환경 핸들, 연결 핸들 또는 문 핸들로 인해 함수가 실패했습니다. 이는 프로그래밍 오류를 나타냅니다. 에서 SQLError 사용할 수 있는 추가 정보는 없습니다. |
SQL_STILL_EXECUTING |
비동기적으로 시작된 함수는 여전히 실행 중입니다. 기본적으로 MFC는 이 값을 ;에 CheckRowsetError 전달하지 않습니다. MFC는 더 이상 반환되지 않을 때까지 계속 호출 SQLExtendedFetch 합니다 SQL_STILL_EXECUTING . |
자세한 내용은 SQLError
Windows SDK를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
CRecordset::Close
레코드 집합을 닫습니다.
virtual void Close();
설명
레코드 집합에 할당된 ODBC HSTMT
및 모든 메모리는 할당 취소됩니다. 일반적으로 호출 Close
한 후에는 C++ 레코드 집합 개체가 할당된 new
경우 삭제합니다.
를 호출한 후 다시 호출 Open
Close
할 수 있습니다. 이렇게 하면 레코드 집합 개체를 다시 사용할 수 있습니다. 대안은 호출 Requery
하는 것입니다.
예시
// Construct a snapshot object
CCustomer rsCustSet(NULL);
if (!rsCustSet.Open())
return;
// Use the snapshot ...
// Close the snapshot
rsCustSet.Close();
// Destructor is called when the function exits
CRecordset::CRecordset
CRecordset
개체를 생성합니다.
CRecordset(CDatabase* pDatabase = NULL);
매개 변수
pDatabase
개체 또는 값NULL
에 대한 CDatabase
포인터를 포함합니다. 그렇지 않은 NULL
CDatabase
경우 개체의 Open
멤버 함수를 호출하여 데이터 원본에 연결하지 않은 경우 레코드 집합은 자체 Open
호출 중에 해당 함수를 열려고 시도합니다. 전달 NULL
CDatabase
하면 ClassWizard를 사용하여 레코드 집합 클래스를 파생할 때 지정한 데이터 원본 정보를 사용하여 개체가 생성되고 연결됩니다.
설명
직접 사용 CRecordset
하거나 애플리케이션별 클래스 CRecordset
를 파생시킬 수 있습니다. ClassWizard를 사용하여 레코드 집합 클래스를 파생시킬 수 있습니다.
참고 항목
파생 클래스 는 자체 생성자를 제공해야 합니다 . 파생 클래스의 생성자에서 생성자를 CRecordset::CRecordset
호출하여 적절한 매개 변수를 전달합니다.
자동으로 개체를 생성하고 연결하도록 CDatabase
레코드 집합 생성자에 전달 NULL
합니다. 레코드 집합을 생성하기 전에 개체를 생성하고 연결할 CDatabase
필요가 없는 유용한 약식입니다.
예시
자세한 내용은 Recordset: Table에 대한 클래스 선언(ODBC)을 참조하세요.
CRecordset::Delete
현재 레코드를 삭제합니다.
virtual void Delete();
설명
성공적으로 삭제되면 레코드 집합의 필드 데이터 멤버가 Null 값으로 설정되고 삭제된 레코드에서 벗어나려면 함수 중 Move
하나를 명시적으로 호출해야 합니다. 삭제된 레코드에서 이동한 후에는 레코드로 돌아갈 수 없습니다. 데이터 원본이 트랜잭션을 지원하는 경우 트랜잭션의 호출 부분을 만들 Delete
수 있습니다. 자세한 내용은 트랜잭션(ODBC)을 참조하세요.
참고 항목
대량 행 페치를 구현한 경우 호출 Delete
할 수 없습니다. 이로 인해 어설션이 실패합니다. 클래스 CRecordset
는 대량 데이터 행을 업데이트하는 메커니즘을 제공하지 않지만 ODBC API SQLSetPos
함수를 사용하여 고유한 함수를 작성할 수 있습니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
주의
레코드 집합은 업데이터 가능해야 하며 호출 Delete
할 때 레코드 집합에 유효한 레코드가 있어야 합니다. 그렇지 않으면 오류가 발생합니다. 예를 들어 레코드를 삭제하지만 다시 Delete
호출 Delete
하기 전에 새 레코드로 스크롤하지 않으면 CDBException이 throw됩니다.
와 Edit
달리 AddNew
호출 뒤에는 호출 Delete
이 Update
수행되지 않습니다. 호출이 Delete
실패하면 필드 데이터 멤버는 변경되지 않은 상태로 유지됩니다.
예시
이 예제에서는 함수 프레임에서 만든 레코드 집합을 보여 줍니다. 이 예제에서는 데이터 원본에 이미 연결된 형식 CDatabase
의 멤버 변수인 가 있다고 m_dbCust
가정합니다.
// Create a derived CRecordset object
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if (rsCustSet.IsEOF() || !rsCustSet.CanUpdate() ||
!rsCustSet.CanTransact())
{
return;
}
m_dbCust.BeginTrans();
// Perhaps scroll to a new record...
// Delete the current record
rsCustSet.Delete();
// Finished commands for this transaction
if (IDYES == AfxMessageBox(_T("Commit transaction?"), MB_YESNO))
m_dbCust.CommitTrans();
else // User changed mind
m_dbCust.Rollback();
CRecordset::DoBulkFieldExchange
데이터 원본에서 레코드 집합으로 대량 데이터 행을 교환하기 위해 호출됩니다. 대량 레코드 필드 교환(Bulk RFX)을 구현합니다.
virtual void DoBulkFieldExchange(CFieldExchange* pFX);
매개 변수
pFX
CFieldExchange
개체에 대한 포인터입니다. 프레임워크는 필드 교환 작업에 대한 컨텍스트를 지정하도록 이 개체를 이미 설정했습니다.
설명
대량 행 페칭이 구현되면 프레임워크는 이 멤버 함수를 호출하여 데이터 원본에서 레코드 집합 개체로 데이터를 자동으로 전송합니다. DoBulkFieldExchange
또한 매개 변수 데이터 멤버(있는 경우)를 레코드 집합 선택에 대한 SQL 문 문자열의 매개 변수 자리 표시자에 바인딩합니다.
대량 행 가져오기가 구현되지 않으면 프레임워크에서 호출 DoFieldExchange
합니다. 대량 행 페치를 구현하려면 멤버 함수에서 CRecordset::useMultiRowFetch
dwOptions 매개 변수 Open
의 옵션을 지정해야 합니다.
참고 항목
DoBulkFieldExchange
에서 파생된 CRecordset
클래스를 사용하는 경우에만 사용할 수 있습니다. 레코드 집합 개체를 직접 CRecordset
만든 경우 멤버 함수를 GetFieldValue
호출하여 데이터를 검색해야 합니다.
대량 레코드 필드 교환(Bulk RFX)은 RFX(레코드 필드 교환)와 유사합니다. 데이터는 데이터 원본에서 레코드 집합 개체로 자동으로 전송됩니다. 그러나 변경 내용을 호출AddNew
Edit
Delete
하거나 Update
데이터 원본으로 다시 전송할 수는 없습니다. 클래스 CRecordset
는 현재 대량 데이터 행을 업데이트하는 메커니즘을 제공하지 않지만 ODBC API 함수 SQLSetPos
를 사용하여 고유한 함수를 작성할 수 있습니다.
ClassWizard는 대량 레코드 필드 교환을 지원하지 않습니다. 따라서 대량 RFX 함수에 대한 호출을 작성하여 수동으로 재정 DoBulkFieldExchange
의해야 합니다. 이러한 함수에 대한 자세한 내용은 레코드 필드 교환 함수를 참조 하세요.
대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요. 관련 정보는 RFX(레코드 필드 교환)를 참조하세요.
CRecordset::DoFieldExchange
레코드 집합의 필드 데이터 멤버와 데이터 원본의 해당 레코드 간에 양방향으로 데이터를 교환하기 위해 호출됩니다. RFX(레코드 필드 교환)를 구현합니다.
virtual void DoFieldExchange(CFieldExchange* pFX);
매개 변수
pFX
CFieldExchange
개체에 대한 포인터입니다. 프레임워크는 필드 교환 작업에 대한 컨텍스트를 지정하도록 이 개체를 이미 설정했습니다.
설명
대량 행 가져오기가 구현되지 않은 경우 프레임워크는 이 멤버 함수를 호출하여 레코드 집합 개체의 필드 데이터 멤버와 데이터 원본에 있는 현재 레코드의 해당 열 간에 데이터를 자동으로 교환합니다. DoFieldExchange
또한 매개 변수 데이터 멤버(있는 경우)를 레코드 집합 선택에 대한 SQL 문 문자열의 매개 변수 자리 표시자에 바인딩합니다.
대량 행 페칭이 구현되면 프레임워크는 .를 호출합니다 DoBulkFieldExchange
. 대량 행 페치를 구현하려면 멤버 함수에서 CRecordset::useMultiRowFetch
dwOptions
Open
매개 변수 옵션을 지정해야 합니다.
참고 항목
DoFieldExchange
에서 파생된 CRecordset
클래스를 사용하는 경우에만 사용할 수 있습니다. 레코드 집합 개체를 직접 CRecordset
만든 경우 GetFieldValue 멤버 함수를 호출하여 데이터를 검색해야 합니다.
RFX(레코드 필드 교환)라고 하는 필드 데이터 교환은 레코드 집합 개체의 필드 데이터 멤버에서 데이터 원본의 레코드 필드, 데이터 원본의 레코드에서 레코드 집합 개체까지 양방향으로 작동합니다.
파생 레코드 집합 클래스에 대해 일반적으로 구현 DoFieldExchange
하기 위해 수행해야 하는 유일한 작업은 ClassWizard를 사용하여 클래스를 만들고 필드 데이터 멤버의 이름과 데이터 형식을 지정하는 것입니다. ClassWizard가 작성하는 코드에 코드를 추가하여 매개 변수 데이터 멤버를 지정하거나 동적으로 바인딩하는 열을 처리할 수도 있습니다. 자세한 내용은 레코드 집합: 데이터 열 동적 바인딩(ODBC)을 참조하세요.
ClassWizard를 사용하여 파생 레코드 집합 클래스를 선언하면 마법사는 다음 예제와 유사한 재정의 DoFieldExchange
를 작성합니다.
void CCustomer::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
// Macros such as RFX_Text() and RFX_Int() are dependent on the
// type of the member variable, not the type of the field in the database.
// ODBC will try to automatically convert the column value to the requested type
RFX_Long(pFX, _T("[CustomerID]"), m_CustomerID);
RFX_Text(pFX, _T("[ContactFirstName]"), m_ContactFirstName);
RFX_Text(pFX, _T("[PostalCode]"), m_PostalCode);
RFX_Text(pFX, _T("[L_Name]"), m_L_Name);
RFX_Long(pFX, _T("[BillingID]"), m_BillingID);
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param"), m_strParam);
}
RFX 함수에 대한 자세한 내용은 레코드 필드 교환 함수를 참조 하세요.
자세한 예제 및 자세한 내용은 DoFieldExchange
레코드 필드 교환: RFX 작동 방식을 참조 하세요. RFX에 대한 일반적인 내용은 레코드 필드 교환을 참조 하세요.
CRecordset::Edit
현재 레코드를 변경할 수 있습니다.
virtual void Edit();
설명
호출 Edit
한 후 해당 값을 직접 다시 설정하여 필드 데이터 멤버를 변경할 수 있습니다. 멤버 함수를 호출하여 데이터 원본에 Update
변경 내용을 저장할 때 작업이 완료됩니다.
참고 항목
대량 행 페치를 구현한 경우 호출 Edit
할 수 없습니다. 이로 인해 어설션이 실패합니다. 클래스 CRecordset
는 대량 데이터 행을 업데이트하는 메커니즘을 제공하지 않지만 ODBC API SQLSetPos
함수를 사용하여 고유한 함수를 작성할 수 있습니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
Edit
는 레코드 집합의 데이터 멤버 값을 저장합니다. 호출 Edit
하고 변경한 다음 다시 호출 Edit
하면 레코드의 값이 첫 번째 Edit
호출 이전 값으로 복원됩니다.
경우에 따라 열이 Null(데이터 없음)으로 만들어 열을 업데이트할 수 있습니다. 이렇게 하려면 TRUE 매개 변수를 사용하여 Null SetFieldNull
필드를 표시합니다. 이렇게 하면 열도 업데이트됩니다. 값이 변경되지 않았더라도 필드를 데이터 원본에 쓰려면 TRUE 매개 변수를 사용하여 호출 SetFieldDirty
합니다. 필드에 Null 값이 있는 경우에도 작동합니다.
데이터 원본이 트랜잭션을 지원하는 경우 트랜잭션의 호출 부분을 만들 Edit
수 있습니다. 호출하기 전과 레코드 집합이 열린 후 호출 CDatabase::BeginTrans
Edit
합니다. 또한 호출 CDatabase::CommitTrans
은 작업을 완료하기 위해 호출 Update
하는 대신 사용할 수 Edit
없습니다. 트랜잭션에 대한 자세한 내용은 클래스를 참조하세요 CDatabase
.
현재 잠금 모드에 따라 다른 레코드를 호출 Update
하거나 스크롤할 때까지 업데이트되는 레코드가 Edit
잠기거나 호출 중에 Edit
만 잠글 수 있습니다. 로 잠금 모드 SetLockingMode
를 변경할 수 있습니다.
호출 Update
하기 전에 새 레코드로 스크롤하면 현재 레코드의 이전 값이 복원됩니다. 업데이트할 수 없는 레코드 집합을 호출 Edit
하거나 현재 레코드가 없는 경우 A CDBException
가 throw됩니다.
자세한 내용은 ODBC(Transaction) 및 Recordset: Locking Records(ODBC) 문서를 참조하세요.
예시
// To edit a record, first set up the edit buffer
rsCustSet.Edit();
// Then edit field data members for the record
rsCustSet.m_BillingID = 2795;
rsCustSet.m_ContactFirstName = _T("Jones Mfg");
// Finally, complete the operation
if (!rsCustSet.Update())
{
// Handle the failure to update
AfxMessageBox(_T("Couldn't update record!"));
}
CRecordset::FlushResultSet
여러 결과 집합이 있는 경우 미리 정의된 쿼리(저장 프로시저)의 다음 결과 집합을 검색합니다.
BOOL FlushResultSet();
반환 값
검색할 결과 집합이 더 있는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
현재 결과 집합에서 커서를 완료한 경우에만 호출 FlushResultSet
해야 합니다. 호출FlushResultSet
하여 다음 결과 집합을 검색하는 경우 해당 결과 집합에서 커서가 유효하지 않습니다. 호출 FlushResultSet
후 멤버 함수를 MoveNext
호출해야 합니다.
미리 정의된 쿼리에서 출력 매개 변수 또는 입력/출력 매개 변수를 사용하는 경우 이러한 매개 변수 값을 얻으려면 반환FALSE
될 때까지 호출 FlushResultSet
해야 합니다(값 0).
FlushResultSet
는 ODBC API 함수 SQLMoreResults
를 호출합니다. 반환 SQL_ERROR
하거나 SQL_INVALID_HANDLE
반환 FlushResultSet
하면 SQLMoreResults
예외가 throw됩니다. 자세한 내용은 SQLMoreResults
Windows SDK를 참조하세요.
를 호출 FlushResultSet
하려면 저장 프로시저에 바인딩된 필드가 있어야 합니다.
예시
다음 코드에서는 CRecordset
입력 매개 변수와 출력 매개 변수가 있는 미리 정의된 쿼리를 기반으로 하며 여러 결과 집합이 있는 -derived 개체라고 가정 COutParamRecordset
합니다. 재정의의 구조를 확인 DoFieldExchange
합니다.
// DoFieldExchange override
//
// Only necessary to handle parameter bindings.
// Don't use CRecordset-derived class with bound
// fields unless all result sets have same schema
// OR there is conditional binding code.
void CCourses::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputParam);
RFX_Long(pFX, _T("Param1"), m_nCountParam);
// The "Param1" name here is a dummy name
// that is never used
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, _T("Param2"), m_strNameParam);
// The "Param2" name here is a dummy name
// that is never used
}
// Assume db is an already open CDatabase object
CCourses rs(&m_dbCust);
rs.m_strNameParam = _T("History");
// Get the first result set
// NOTE: SQL Server requires forwardOnly cursor
// type for multiple rowset returning stored
// procedures
rs.Open(CRecordset::forwardOnly,
_T("{? = CALL GetCourses( ? )}"),
CRecordset::readOnly);
// Loop through all the data in the first result set
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
// Retrieve other result sets...
while (rs.FlushResultSet())
{
// must call MoveNext because cursor is invalid
rs.MoveNext();
while (!rs.IsEOF())
{
CString strFieldValue;
for (short nIndex = 0; nIndex < rs.GetODBCFieldCount(); nIndex++)
{
rs.GetFieldValue(nIndex, strFieldValue);
// TO DO: Use field value string.
}
rs.MoveNext();
}
}
// All result sets have been flushed. Cannot
// use the cursor, but the output parameter,
// m_nCountParam, has now been written.
// Note that m_nCountParam is not valid until
// CRecordset::FlushResultSet has returned FALSE,
// indicating no more result sets will be returned.
// TO DO: Use m_nCountParam
// Cleanup
rs.Close();
CRecordset::GetBookmark
현재 레코드의 책갈피 값을 가져옵니다.
void GetBookmark(CDBVariant& varBookmark);
매개 변수
varBookmark
현재 레코드의 CDBVariant
책갈피를 나타내는 개체에 대한 참조입니다.
설명
레코드 집합에서 책갈피가 지원되는지 확인하려면 .를 호출 CanBookmark
합니다. 지원되는 경우 책갈피를 사용할 수 있도록 하려면 멤버 함수의 Open
매개 변수에서 dwOptions
옵션을 설정 CRecordset::useBookmarks
해야 합니다.
참고 항목
책갈피가 지원되지 않거나 사용할 수 없는 경우 호출 GetBookmark
하면 예외가 throw됩니다. 책갈피는 전달 전용 레코드 집합에서 지원되지 않습니다.
GetBookmark
는 현재 레코드의 책갈피 값을 개체에 CDBVariant
할당합니다. 다른 레코드로 이동한 후 언제든지 해당 레코드로 돌아가려면 해당 CDBVariant
개체를 호출 SetBookmark
합니다.
참고 항목
특정 레코드 집합 작업 후에는 책갈피가 더 이상 유효하지 않을 수 있습니다. 예를 들어 다음에 Requery
호출 GetBookmark
하는 경우 .를 사용하여 레코드SetBookmark
로 돌아가지 못할 수 있습니다. 호출 CDatabase::GetBookmarkPersistence
하여 안전하게 호출 SetBookmark
할 수 있는지 확인합니다.
책갈피 및 레코드 집합 탐색에 대한 자세한 내용은 Recordset: ODBC(책갈피 및 절대 위치) 및 레코드 집합: 스크롤(ODBC) 문서를 참조하세요.
CRecordset::GetDefaultConnect
기본 연결 문자열 가져오기 위해 호출됩니다.
virtual CString GetDefaultConnect();
반환 값
기본 연결 문자열 포함하는 A CString
입니다.
설명
프레임워크는 이 멤버 함수를 호출하여 레코드 집합의 기반이 되는 데이터 원본에 대한 기본 연결 문자열 가져옵니다. ClassWizard
는 테이블 및 열에 대한 정보를 가져오는 데 사용하는 ClassWizard
것과 동일한 데이터 원본을 식별하여 이 함수를 구현합니다. 애플리케이션을 개발하는 동안 이 기본 연결을 사용하는 것이 편리할 것입니다. 그러나 기본 연결은 애플리케이션 사용자에게 적합하지 않을 수 있습니다. 이 경우 이 함수를 다시 설치하여 ClassWizard
'의 버전을 삭제해야 합니다. 연결 문자열 대한 자세한 내용은 ODBC(데이터 원본)를 참조하세요.
CRecordset::GetDefaultSQL
실행할 기본 SQL 문자열을 가져오기 위해 호출됩니다.
virtual CString GetDefaultSQL();
반환 값
기본 SQL 문을 포함하는 A CString
입니다.
설명
프레임워크는 이 멤버 함수를 호출하여 레코드 집합의 기반이 되는 기본 SQL 문을 가져옵니다. 테이블 이름 또는 SQL SELECT
문일 수 있습니다.
레코드 집합 클래스 ClassWizard
를 사용하여 선언하여 기본 SQL 문을 간접적으로 정의하고 ClassWizard
이 작업을 수행합니다.
고유한 용도로 SQL 문 문자열이 필요한 경우 레코드 집합이 열릴 때 레코드 집합의 레코드를 선택하는 데 사용되는 SQL 문을 반환하는 호출 GetSQL
입니다. 클래스의 재정 GetDefaultSQL
의에서 기본 SQL 문자열을 편집할 수 있습니다. 예를 들어 문을 사용하여 미리 정의된 쿼리에 대한 호출을 지정할 수 있습니다 CALL
. 그러나 편집 GetDefaultSQL
하는 경우 데이터 원본의 열 수와 일치하도록 수정 m_nFields
해야 합니다.
자세한 내용은 Recordset: Table에 대한 클래스 선언(ODBC)을 참조하세요.
주의
프레임워크에서 테이블 이름을 식별할 수 없거나, 여러 테이블 이름을 제공했거나, 문을 해석할 수 없는 경우 CALL
테이블 이름은 비어 있습니다. 문을 사용하는 CALL
경우 중괄호와 키워드 사이에 공백을 CALL
삽입하거나 중괄호 앞이나 문에서 키워드 앞에 SELECT
공백을 SELECT
삽입하지 마세요.
CRecordset::GetFieldValue
현재 레코드에서 필드 데이터를 검색합니다.
void GetFieldValue(
LPCTSTR lpszName,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
LPCTSTR lpszName,
CStringA& strValue
);
void GetFieldValue(
LPCTSTR lpszName,
CStringW& strValue
);
void GetFieldValue(
short nIndex,
CDBVariant& varValue,
short nFieldType = DEFAULT_FIELD_TYPE);
void GetFieldValue(
short nIndex,
CStringA& strValue);
void GetFieldValue(
short nIndex,
CStringW& strValue);
매개 변수
lpszName
필드의 이름입니다.
varValue
필드 값을 저장할 개체에 대한 참조 CDBVariant
입니다.
nFieldType
필드의 ODBC C 데이터 형식입니다. 기본값 DEFAULT_FIELD_TYPE
을 사용하여 다음 표에 따라 SQL 데이터 형식에서 C 데이터 형식을 결정합니다 GetFieldValue
. 그렇지 않으면 데이터 형식을 직접 지정하거나 호환되는 데이터 형식을 선택할 수 있습니다. 예를 들어 모든 데이터 형식을 .에 SQL_C_CHAR
저장할 수 있습니다.
C 데이터 형식 | SQL 데이터 형식 |
---|---|
SQL_C_BIT |
SQL_BIT |
SQL_C_UTINYINT |
SQL_TINYINT |
SQL_C_SSHORT |
SQL_SMALLINT |
SQL_C_SLONG |
SQL_INTEGER |
SQL_C_FLOAT |
SQL_REAL |
SQL_C_DOUBLE |
SQL_FLOATSQL_DOUBLE |
SQL_C_TIMESTAMP |
SQL_DATESQL_TIMESQL_TIMESTAMP |
SQL_C_CHAR |
SQL_NUMERICSQL_DECIMALSQL_BIGINTSQL_CHARSQL_VARCHARSQL_LONGVARCHAR |
SQL_C_BINARY |
SQL_BINARYSQL_VARBINARYSQL_LONGVARBINARY |
ODBC 데이터 형식에 대한 자세한 내용은 Windows SDK 부록 D의 "SQL 데이터 형식" 및 "C 데이터 형식" 항목을 참조하세요.
nIndex
필드의 인덱스(0부터 시작하는 인덱스)입니다.
strValue
필드의 데이터 형식에 CString
관계없이 텍스트로 변환된 필드 값을 저장할 개체에 대한 참조입니다.
설명
이름 또는 인덱스로 필드를 조회할 수 있습니다. 개체 또는 CString
개체에 CDBVariant
필드 값을 저장할 수 있습니다.
대량 행 가져오기를 구현한 경우 현재 레코드는 항상 행 집합의 첫 번째 레코드에 배치됩니다. 지정된 행 집합 내의 레코드에서 사용 GetFieldValue
하려면 먼저 멤버 함수를 호출 SetRowsetCursorPosition
하여 커서를 해당 행 집합 내의 원하는 행으로 이동해야 합니다. 그런 다음 해당 행을 호출 GetFieldValue
합니다. 대량 행 페치를 구현하려면 멤버 함수에서 CRecordset::useMultiRowFetch
dwOptions
Open
매개 변수 옵션을 지정해야 합니다.
디자인 타임에 정적으로 바인딩하는 대신 런타임에 필드를 동적으로 가져오는 데 사용할 GetFieldValue
수 있습니다. 예를 들어 레코드 집합 개체를 직접 CRecordset
선언한 경우 필드 데이터를 검색하는 데 사용해야 GetFieldValue
합니다. RFX(레코드 필드 교환) 또는 대량 레코드 필드 교환(Bulk RFX)은 구현되지 않습니다.
참고 항목
파생되지 않고 레코드 집합 개체를 선언하는 CRecordset
경우 ODBC 커서 라이브러리가 로드되지 않습니다. 커서 라이브러리를 사용하려면 레코드 집합에 하나 이상의 바인딩된 열이 있어야 합니다. 그러나 직접 사용하는 CRecordset
경우 열이 바인딩되지 않습니다. 멤버 함수는 CDatabase::OpenEx
CDatabase::Open
커서 라이브러리를 로드할지 여부를 제어합니다.
GetFieldValue
는 ODBC API 함수 SQLGetData
를 호출합니다. 드라이버가 필드 값의 실제 길이에 대한 SQL_NO_TOTAL 값을 GetFieldValue
출력하는 경우 예외를 throw합니다. 자세한 내용은 SQLGetData
Windows SDK를 참조하세요.
예시
다음 샘플 코드에서는 .에서 CRecordset
직접 선언된 레코드 집합 개체에 대한 호출 GetFieldValue
을 보여 줍니다.
// Create and open a database object;
// do not load the cursor library
CDatabase db;
db.OpenEx(NULL, CDatabase::forceOdbcDialog);
// Create and open a recordset object
// directly from CRecordset. Note that a
// table must exist in a connected database.
// Use forwardOnly type recordset for best
// performance, since only MoveNext is required
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, _T("SELECT * FROM Customer"));
// Create a CDBVariant object to
// store field data
CDBVariant varValue;
// Loop through the recordset,
// using GetFieldValue and
// GetODBCFieldCount to retrieve
// data in all columns
short nFields = rs.GetODBCFieldCount();
while (!rs.IsEOF())
{
for (short index = 0; index < nFields; index++)
{
rs.GetFieldValue(index, varValue);
// do something with varValue
}
rs.MoveNext();
}
rs.Close();
db.Close();
참고 항목
DAO 클래스 CDaoRecordset
CRecordset
와 달리 멤버 함수는 SetFieldValue
없습니다. 개체를 직접 CRecordset
만드는 경우 사실상 읽기 전용입니다.
대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
CRecordset::GetODBCFieldCount
레코드 집합 개체의 총 필드 수를 검색합니다.
short GetODBCFieldCount() const;
반환 값
레코드 집합의 필드 수입니다.
설명
레코드 집합을 만드는 방법에 대한 자세한 내용은 레코드 집합 : ODBC(레코드 집합 만들기 및 닫기)를 참조하세요.
CRecordset::GetODBCFieldInfo
레코드 집합의 필드에 대한 정보를 가져옵니다.
void GetODBCFieldInfo(
LPCTSTR lpszName,
CODBCFieldInfo& fieldinfo);
void GetODBCFieldInfo(
short nIndex,
CODBCFieldInfo& fieldinfo);
매개 변수
lpszName
필드의 이름입니다.
fieldinfo
구조체에 대한 참조입니다 CODBCFieldInfo
.
nIndex
필드의 인덱스(0부터 시작하는 인덱스)입니다.
설명
함수의 한 버전을 사용하면 이름으로 필드를 조회할 수 있습니다. 다른 버전을 사용하면 인덱스별로 필드를 조회할 수 있습니다.
반환된 정보에 대한 설명은 구조를 참조하세요 CODBCFieldInfo
.
레코드 집합을 만드는 방법에 대한 자세한 내용은 레코드 집합 : ODBC(레코드 집합 만들기 및 닫기)를 참조하세요.
CRecordset::GetRecordCount
레코드 집합의 크기를 결정합니다.
long GetRecordCount() const;
반환 값
레코드 집합의 레코드 수입니다. 레코드 집합에 레코드가 없으면 0입니다. 레코드 수를 확인할 수 없는 경우 -1입니다.
설명
주의
레코드 수는 사용자가 레코드를 통해 이동할 때 볼 수 있는 가장 높은 번호 레코드인 "높은 워터 마크"로 유지됩니다. 총 레코드 수는 사용자가 마지막 레코드를 넘어 이동한 후에만 알 수 있습니다. 성능상의 이유로 호출 MoveLast
할 때 개수가 업데이트되지 않습니다. 레코드를 직접 계산하려면 0이 아닌 값을 반환할 때까지 IsEOF
반복적으로 호출 MoveNext
합니다. 레코드를 통해 CRecordset:AddNew
Update
추가하고 개수를 증가합니다. 레코드를 통해 CRecordset::Delete
삭제하면 개수가 줄어듭니다.
CRecordset::GetRowsetSize
지정된 인출 중에 검색하려는 행 수에 대한 현재 설정을 가져옵니다.
DWORD GetRowsetSize() const;
반환 값
지정된 인출 중에 검색할 행 수입니다.
설명
대량 행 가져오기를 사용하는 경우 레코드 집합이 열릴 때 기본 행 집합 크기는 25입니다. 그렇지 않으면 1입니다.
대량 행 페치를 구현하려면 멤버 함수의 Open
매개 변수에 dwOptions
옵션을 지정 CRecordset::useMultiRowFetch
해야 합니다. 행 집합 크기에 대한 설정을 변경하려면 .를 호출합니다 SetRowsetSize
.
대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
CRecordset::GetRowsFetched
인출 후 검색된 레코드 수를 결정합니다.
DWORD GetRowsFetched() const;
반환 값
지정된 인출 후 데이터 원본에서 검색된 행 수입니다.
설명
이는 대량 행 페치를 구현한 경우에 유용합니다. 행 집합 크기는 일반적으로 페치에서 검색되는 행 수를 나타냅니다. 그러나 레코드 집합의 총 행 수는 행 집합에서 검색되는 행 수에도 영향을 줍니다. 예를 들어 레코드 집합에 행 집합 크기 설정이 4인 10개의 레코드가 있는 경우 호출 MoveNext
을 통해 레코드 집합을 반복하면 마지막 행 집합에 두 개의 레코드만 포함됩니다.
대량 행 페치를 구현하려면 멤버 함수의 CRecordset::useMultiRowFetch
dwOptions 매개 변수 Open
에 옵션을 지정해야 합니다. 행 집합 크기를 지정하려면 SetRowsetSize를 호출 합니다.
대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
예시
CMultiCustomer rs(&m_dbCust);
// Set the rowset size
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// loop through the recordset by rowsets
while (!rs.IsEOF())
{
for (int rowCount = 0; rowCount < (int)rs.GetRowsFetched(); rowCount++)
{
// do something
}
rs.MoveNext();
}
rs.Close();
CRecordset::GetRowStatus
현재 행 집합의 행 상태를 가져옵니다.
WORD GetRowStatus(WORD wRow) const;
매개 변수
wRow
현재 행 집합에 있는 행의 1부터 시작하는 위치입니다. 이 값의 범위는 1에서 행 집합의 크기까지입니다.
반환 값
행의 상태 값입니다. 자세한 내용은 설명을 참조하세요.
설명
GetRowStatus
는 데이터 원본에서 마지막으로 검색된 이후의 행 상태가 변경되었거나 해당 행이 페치되지 않음을 나타내는 값을 반환합니다 wRow
. 다음 표에서는 가능한 반환 값을 보여 줍니다.
상태 값 | 설명 |
---|---|
SQL_ROW_SUCCESS |
행은 변경되지 않습니다. |
SQL_ROW_UPDATED |
행이 업데이트되었습니다. |
SQL_ROW_DELETED |
행이 삭제되었습니다. |
SQL_ROW_ADDED |
행이 추가되었습니다. |
SQL_ROW_ERROR |
오류로 인해 행을 복구할 수 없습니다. |
SQL_ROW_NOROW |
에 해당하는 행이 wRow 없습니다. |
자세한 내용은 Windows SDK의 ODBC API 함수 SQLExtendedFetch
를 참조하세요.
CRecordset::GetStatus
레코드 집합에서 현재 레코드의 인덱스와 마지막 레코드가 표시되었는지 여부를 결정합니다.
void GetStatus(CRecordsetStatus& rStatus) const;
매개 변수
rStatus
CRecordsetStatus
개체에 대한 참조입니다. 자세한 내용은 설명을 참조하세요.
설명
CRecordset
는 인덱스를 추적하려고 시도하지만 일부 상황에서는 불가능할 수 있습니다. 설명은 참조 GetRecordCount
하세요.
구조체 CRecordsetStatus
의 형식은 다음과 같습니다.
struct CRecordsetStatus
{
long m_lCurrentRecord;
BOOL m_bRecordCountFinal;
};
두 멤버의 CRecordsetStatus
의미는 다음과 같습니다.
m_lCurrentRecord
알려진 경우 레코드 집합에 있는 현재 레코드의 인덱스(0부터 시작하는 인덱스)를 포함합니다. 인덱스를 확인할 수 없는 경우 이 멤버에는 (-2)가 포함됩니다AFX_CURRENT_RECORD_UNDEFINED
. TRUE(빈 레코드 집합 또는 첫 번째 레코드 앞 스크롤 시도)m_lCurrentRecord
이면IsBOF
(-1)로 설정AFX_CURRENT_RECORD_BOF
됩니다. 첫 번째 레코드에 있는 경우 0, 두 번째 레코드 1 등으로 설정됩니다.m_bRecordCountFinal
레코드 집합의 총 레코드 수가 결정된 경우 0이 아닌 경우 일반적으로 레코드 집합의 시작 부분에서 시작하여 0이 아닌 값을 반환할 때까지IsEOF
호출MoveNext
하여 수행해야 합니다. 이 멤버가 0이면 -1이 아닌 경우 반환된GetRecordCount
레코드 수는 레코드의 "높은 워터 마크" 개수에 불과합니다.
CRecordset::GetSQL
이 멤버 함수를 호출하여 레코드 집합이 열릴 때 레코드 집합의 레코드를 선택하는 데 사용된 SQL 문을 가져옵니다.
const CString& GetSQL() const;
반환 값
const
CString
SQL 문을 포함하는 참조입니다.
설명
일반적으로 SQL SELECT
문입니다. 반환된 GetSQL
문자열은 읽기 전용입니다.
반환된 GetSQL
문자열은 일반적으로 매개 변수의 레코드 집합에 멤버 함수에 전달했을 수 있는 lpszSQL
문자열과 Open
다릅니다. 레코드 집합은 전달한 내용, 지정한 항목, 데이터 멤버 및 m_strSort
지정ClassWizard
한 Open
매개 변수에 m_strFilter
따라 전체 SQL 문을 생성하기 때문입니다. 레코드 집합이 이 SQL 문을 생성하는 방법에 대한 자세한 내용은 Recordset: Recordsets에서 레코드를 선택하는 방법(ODBC)을 참조하세요.
참고 항목
를 호출한 후에만 이 멤버 함수를 호출합니다 Open
.
CRecordset::GetTableName
레코드 집합의 쿼리를 기반으로 하는 SQL 테이블의 이름을 가져옵니다.
const CString& GetTableName() const;
반환 값
const
레코드 집합이 테이블을 기반으로 하는 CString
경우 테이블 이름을 포함하는 참조이고, 그렇지 않으면 빈 문자열입니다.
설명
GetTableName
는 레코드 집합이 여러 테이블의 조인이나 미리 정의된 쿼리(저장 프로시저)가 아니라 테이블을 기반으로 하는 경우에만 유효합니다. 이름은 읽기 전용입니다.
참고 항목
를 호출한 후에만 이 멤버 함수를 호출합니다 Open
.
CRecordset::IsBOF
레코드 집합이 첫 번째 레코드 앞에 배치된 경우 0이 아닌 값을 반환합니다. 현재 레코드가 없습니다.
BOOL IsBOF() const;
반환 값
레코드 집합에 레코드가 없거나 첫 번째 레코드 앞에서 뒤로 스크롤한 경우 0이 아닙니다. 그렇지 않으면 0입니다.
설명
레코드에서 레코드로 스크롤하기 전에 이 멤버 함수를 호출하여 레코드 집합의 첫 번째 레코드 앞에 갔는지 여부를 알아봅니다. 레코드 집합에 레코드가 포함되어 있는지 아니면 비어 있는지를 확인하는 데 함께 IsEOF
사용할 IsBOF
수도 있습니다. 호출 Open
직후 레코드 집합에 레코드가 없으면 0이 아닌 IsBOF
값을 반환합니다. 레코드가 하나 이상 있는 레코드 집합을 열면 첫 번째 레코드는 현재 레코드이고 IsBOF
0을 반환합니다.
첫 번째 레코드가 현재 레코드이고 호출 MovePrev
IsBOF
하는 경우 0이 아닌 레코드를 반환합니다. 0이 아닌 값을 반환하고 호출MovePrev
하면 IsBOF
오류가 발생합니다. 0이 아닌 레코드를 반환하면 IsBOF
현재 레코드가 정의되지 않으며 현재 레코드가 필요한 모든 작업에 오류가 발생합니다.
예시
이 예제에서는 코드가 양방향으로 레코드 집합을 스크롤할 때 레코드 집합의 제한을 사용하고 IsBOF
IsEOF
검색합니다.
// Open a recordset; first record is current
// Open a recordset; first record is current
CCustomer rsCustSet(&m_dbCust);
rsCustSet.Open();
if(rsCustSet.IsBOF())
return;
// The recordset is empty
// Scroll to the end of the recordset, past
// the last record, so no record is current
while (!rsCustSet.IsEOF())
rsCustSet.MoveNext();
// Move to the last record
rsCustSet.MoveLast();
// Scroll to beginning of the recordset, before
// the first record, so no record is current
while(!rsCustSet.IsBOF())
rsCustSet.MovePrev();
// First record is current again
rsCustSet.MoveFirst();
CRecordset::IsDeleted
현재 레코드가 삭제되었는지 여부를 확인합니다.
BOOL IsDeleted() const;
반환 값
레코드 집합이 삭제된 레코드에 배치된 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
레코드로 스크롤하여 IsDeleted
반환 TRUE
하는 경우(0이 아닌 경우) 다른 레코드 집합 작업을 수행하려면 먼저 다른 레코드로 스크롤해야 합니다.
결과는 IsDeleted
레코드 집합 유형, 레코드 집합을 업데이트할 수 있는지 여부, 레코드 집합을 열 때 옵션을 지정 CRecordset::skipDeletedRecords
했는지 여부, 드라이버 팩이 레코드를 삭제했는지 여부 및 여러 사용자가 있는지 여부와 같은 여러 요인에 따라 달라집니다.
드라이버 압축에 대한 CRecordset::skipDeletedRecords
자세한 내용은 Open 멤버 함수를 참조하세요.
참고 항목
대량 행 페치를 구현한 경우 호출 IsDeleted
하면 안 됩니다. 대신 GetRowStatus 멤버 함수를 호출합니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
CRecordset::IsEOF
레코드 집합이 마지막 레코드 뒤의 위치에 있으면 0이 아닌 값을 반환합니다. 현재 레코드가 없습니다.
BOOL IsEOF() const;
반환 값
레코드 집합에 레코드가 없거나 마지막 레코드를 넘어 스크롤한 경우 0이 아닙니다. 그렇지 않으면 0입니다.
설명
레코드에서 레코드로 스크롤할 때 이 멤버 함수를 호출하여 레코드 집합의 마지막 레코드를 초과했는지 여부를 알아봅니다. 레코드 집합에 레코드가 포함되어 있는지 아니면 비어 있는지 확인하는 데 사용할 IsEOF
수도 있습니다. 호출 Open
직후 레코드 집합에 레코드가 없으면 0이 아닌 IsEOF
값을 반환합니다. 레코드가 하나 이상 있는 레코드 집합을 열면 첫 번째 레코드는 현재 레코드이고 IsEOF
0을 반환합니다.
호출 MoveNext
할 때 마지막 레코드가 현재 레코드이면 0이 IsEOF
아닌 레코드가 반환됩니다. 0이 아닌 값을 반환하고 호출MoveNext
하면 IsEOF
오류가 발생합니다. 0이 아닌 레코드를 반환하면 IsEOF
현재 레코드가 정의되지 않으며 현재 레코드가 필요한 모든 작업에 오류가 발생합니다.
예시
IsBOF
에 대한 예를 참조하세요.
CRecordset::IsFieldDirty
지정된 필드 데이터 멤버가 변경 Edit
되었거나 AddNew
호출되었는지 여부를 확인합니다.
BOOL IsFieldDirty(void* pv);
매개 변수
pv
상태를 확인하려는 필드 데이터 멤버에 대한 포인터이거나 NULL
필드가 더티인지 여부를 확인하는 포인터입니다.
반환 값
호출 AddNew
후 지정된 필드 데이터 멤버가 변경되었거나 Edit
, 그렇지 않으면 0이면 0이 아닌 경우
설명
모든 더티 필드 데이터 멤버의 데이터는 현재 레코드가 호출 또는 AddNew
호출에 따라 멤버 함수에 대한 호출에 Update
의해 업데이트될 때 데이터 원본의 CRecordset
레코드로 Edit
전송됩니다.
참고 항목
이 멤버 함수는 대량 행 페치를 사용하는 레코드 집합에는 적용되지 않습니다. 대량 행 페치를 구현한 경우 항상 FALSE를 IsFieldDirty
반환하고 어설션이 실패합니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
호출 IsFieldDirty
하면 필드의 더티 상태가 다시 평가되므로 SetFieldDirty에 대한 이전 호출의 효과가 다시 설정됩니다. 이 AddNew
경우 현재 필드 값이 의사 null 값과 다른 경우 필드 상태가 더티로 설정됩니다. 이 Edit
경우 필드 값이 캐시된 값과 다른 경우 필드 상태가 더티로 설정됩니다.
IsFieldDirty
는 .를 통해 DoFieldExchange
구현됩니다.
더티 플래그 에 대한 자세한 내용은 레코드 집합: 레코드 집합에서 레코드를 선택하는 방법(ODBC)을 참조하세요.
CRecordset::IsFieldNull
현재 레코드의 지정된 필드가 Null(값 없음)이면 0이 아닌 값을 반환합니다.
BOOL IsFieldNull(void* pv);
매개 변수
pv
상태를 확인 NULL
하거나 필드 중 Null인지 여부를 확인할 필드 데이터 멤버에 대한 포인터입니다.
반환 값
지정된 필드 데이터 멤버에 Null로 플래그가 지정된 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
이 멤버 함수를 호출하여 레코드 집합의 지정된 필드 데이터 멤버가 Null로 플래그가 지정되었는지 여부를 확인합니다. (데이터베이스 용어에서 Null은 "값이 없음"을 의미하며 C++와 동일하지 않습니다 NULL
.) 필드 데이터 멤버에 Null로 플래그가 지정되면 값이 없는 현재 레코드의 열로 해석됩니다.
참고 항목
이 멤버 함수는 대량 행 페치를 사용하는 레코드 집합에는 적용되지 않습니다. 대량 행 페치를 IsFieldNull
구현한 경우 항상 반환 FALSE
되고 어설션이 실패합니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
IsFieldNull
는 .를 통해 DoFieldExchange
구현됩니다.
CRecordset::IsFieldNullable
현재 레코드의 지정된 필드를 Null로 설정할 수 있으면 0이 아닌 값을 반환합니다(값 없음).
BOOL IsFieldNullable(void* pv);
매개 변수
pv
상태를 확인하려는 필드 데이터 멤버에 대한 포인터이거나 NULL
필드를 Null 값으로 설정할 수 있는지 확인합니다.
설명
이 멤버 함수를 호출하여 지정된 필드 데이터 멤버가 "nullable"인지 여부를 확인합니다(Null 값으로 설정할 수 있음; C++ NULL
는 Null과 동일하지 않습니다. 즉, 데이터베이스 용어에서 "값 없음"을 의미합니다.)
참고 항목
대량 행 페치를 구현한 경우 호출 IsFieldNullable
할 수 없습니다. 대신 멤버 함수를 GetODBCFieldInfo
호출하여 필드를 Null 값으로 설정할 수 있는지 여부를 확인합니다. 대량 행 페치를 구현했는지 여부에 관계없이 항상 호출 GetODBCFieldInfo
할 수 있습니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
Null일 수 없는 필드에는 값이 있어야 합니다. 레코드를 추가하거나 업데이트할 때 이러한 필드를 Null로 설정하려고 하면 데이터 원본은 추가 또는 업데이트를 Update
거부하고 예외를 throw합니다. 호출할 때가 아니라 호출 Update
할 때 예외가 SetFieldNull
발생합니다.
함수의 첫 번째 인수에 사용하면 NULL
필드가 아닌 param
필드에만 함수가 outputColumn
적용됩니다. 예를 들어 호출
SetFieldNull(NULL);
은 필드만 outputColumn
을 설정하며 param
NULL
, 필드는 영향을 받지 않습니다.
필드에서 작업 param
하려면 다음과 같이 작업하려는 개인의 param
실제 주소를 제공해야 합니다.
SetFieldNull(&m_strParam);
즉, 필드와 outputColumn
마찬가지로 모든 param
필드를 NULL
설정할 수 없습니다.
IsFieldNullable
는 DoFieldExchange를 통해 구현됩니다.
CRecordset::IsOpen
레코드 집합이 이미 열려 있는지 확인합니다.
BOOL IsOpen() const;
반환 값
레코드 집합 개체 Open
또는 Requery
멤버 함수가 이전에 호출되었고 레코드 집합이 닫혀 있지 않은 경우 0이 아니고, 그렇지 않으면 0입니다.
CRecordset::m_hstmt
레코드 집합과 연결된 형식 HSTMT
의 ODBC 문 데이터 구조에 대한 핸들을 포함합니다.
설명
ODBC 데이터 원본에 대한 각 쿼리는 HSTMT
.
주의
호출되기 전에는 Open
사용하지 m_hstmt
마세요.
일반적으로 직접 액세스할 HSTMT
필요는 없지만 SQL 문을 직접 실행하는 데 필요할 수 있습니다. 클래스 CDatabase
의 멤버 함수는 ExecuteSQL
.를 사용하는 m_hstmt
예제를 제공합니다.
CRecordset::m_nFields
레코드 집합 클래스의 필드 데이터 멤버 수를 포함합니다. 즉, 데이터 원본에서 레코드 집합에서 선택한 열 수입니다.
설명
레코드 집합 클래스의 생성자는 올바른 숫자로 초기화 m_nFields
해야 합니다. 대량 행 페치를 구현하지 않은 경우 레코드 집합 클래스를 선언하는 ClassWizard
데 사용할 때 이 초기화를 작성합니다. 수동으로 작성할 수도 있습니다.
프레임워크는 이 숫자를 사용하여 필드 데이터 멤버와 데이터 원본에 있는 현재 레코드의 해당 열 간의 상호 작용을 관리합니다.
주의
이 숫자는 매개 변수CFieldExchange::outputColumn
를 사용하여 호출하거나 DoBulkFieldExchange
호출한 DoFieldExchange
후에 등록된 "출력 열" 수에 SetFieldType
해당해야 합니다.
"Recordset: 동적으로 데이터 열 바인딩" 문서에 설명된 대로 열을 동적으로 바인딩할 수 있습니다. 이렇게 하는 경우 동적으로 바인딩된 열에 m_nFields
대한 멤버 함수의 RFX 또는 Bulk RFX 함수 호출 DoFieldExchange
DoBulkFieldExchange
수를 반영하려면 개수를 늘려야 합니다.
자세한 내용은 레코드 집합: ODBC(동적 바인딩 데이터 열) 및 레코드 집합: 대량 레코드 가져오기(ODBC) 문서를 참조하세요.
예시
RFX 사용: 레코드 필드 교환을 참조하세요.
CRecordset::m_nParams
레코드 집합 클래스의 매개 변수 데이터 멤버 수를 포함합니다. 즉, 레코드 집합의 쿼리와 함께 전달된 매개 변수의 수입니다.
설명
레코드 집합 클래스에 매개 변수 데이터 멤버가 있는 경우 클래스의 생성자는 올바른 숫자로 초기화 m_nParams
해야 합니다. 기본값 m_nParams
은 0입니다. 수동으로 수행해야 하는 매개 변수 데이터 멤버를 추가하는 경우 매개 변수 수를 반영하기 위해 클래스 생성자에서 초기화를 수동으로 추가해야 합니다(사용자 또는 m_strSort
문자열의 '' 자리 표시자 m_strFilter
수만큼 커야 함).
프레임워크는 레코드 집합의 쿼리를 매개 변수화할 때 이 숫자를 사용합니다.
주의
이 번호는 매개 변수 값CFieldExchange::inputParam
이 CFieldExchange::param
CFieldExchange::outputParam
, 또는 CFieldExchange::inoutParam
.인 호출 후 SetFieldType
등록된 DoFieldExchange
DoBulkFieldExchange
"params" 수에 해당해야 합니다.
예시
레코드 집합: 레코드 집합 매개 변수화(ODBC) 및 레코드 필드 교환: RFX 사용 문서를 참조하세요.
CRecordset::m_pDatabase
레코드 집합이 데이터 원본에 CDatabase
연결된 개체에 대한 포인터를 포함합니다.
설명
이 변수는 두 가지 방법으로 설정됩니다. 일반적으로 레코드 집합 개체를 생성할 때 이미 연결된 CDatabase
개체에 포인터를 전달합니다. 대신 CRecordset
전달하는 NULL
경우 개체를 CDatabase
만들어 연결합니다. 두 경우 CRecordset
모두 이 변수에 포인터를 저장합니다.
일반적으로 에 저장된 m_pDatabase
포인터를 직접 사용할 필요가 없습니다. 그러나 고유한 확장을 CRecordset
작성하는 경우 포인터를 사용해야 할 수 있습니다. 예를 들어 고유한 CDBException
포인터를 throw하는 경우 포인터가 필요할 수 있습니다. 또는 트랜잭션 실행, 시간 제한 설정 또는 클래스 CDatabase
의 멤버 함수를 호출 ExecuteSQL
하여 SQL 문을 직접 실행하는 것과 같은 동일한 CDatabase
개체를 사용하여 작업을 수행해야 하는 경우 필요할 수 있습니다.
CRecordset::m_strFilter
레코드 집합 개체를 생성한 후 해당 멤버 함수를 Open
호출하기 전에 이 데이터 멤버를 사용하여 포함하는 SQL WHERE
절을 저장 CString
합니다.
설명
레코드 집합은 이 문자열을 사용하여 호출 중에 Open
Requery
선택한 레코드를 제한하거나 필터링합니다. 이는 "캘리포니아에 본사를 둔 모든 영업 사원"("state = CA")과 같은 레코드의 하위 집합을 선택하는 데 유용합니다. 절에 대한 ODBC SQL 구문은 다음과 같습니다 WHERE
.
WHERE search-condition
문자열에 키워드를 WHERE
포함하지 마세요. 프레임워크에서 제공합니다.
'' 자리 표시자를 배치하고, 각 자리 표시자에 대해 클래스에 매개 변수 데이터 멤버를 선언하고, 런타임에 레코드 집합에 매개 변수를 전달하여 필터 문자열을 매개 변수화할 수도 있습니다. 이렇게 하면 런타임에 필터를 생성할 수 있습니다. 자세한 내용은 Recordset: Recordset 매개 변수화(ODBC)를 참조하세요.
SQL 절에 대한 자세한 내용은 SQLWHERE
을 참조하세요. 레코드 선택 및 필터링에 대한 자세한 내용은 레코드 집합: 레코드 필터링(ODBC)을 참조하세요.
예시
CCustomer rsCustSet(&m_dbCust);
// Set the filter
rsCustSet.m_strFilter = _T("L_Name = 'Flanders'");
// Run the filtered query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::m_strSort
레코드 집합 개체를 생성한 후 해당 멤버 함수를 Open
호출하기 전에 이 데이터 멤버를 사용하여 포함하는 SQL ORDER BY
절을 저장 CString
합니다.
설명
레코드 집합은 이 문자열을 사용하여 호출하는 동안 선택한 레코드를 Open
Requery
정렬합니다. 이 기능을 사용하여 하나 이상의 열에서 레코드 집합을 정렬할 수 있습니다. 절에 대한 ODBC SQL 구문은 다음과 같습니다 ORDER BY
.
ORDER BY sort-specification [, sort-specification]...
여기서 정렬 사양은 정수 또는 열 이름입니다. 정렬 문자열의 열 목록에 "ASC" 또는 "DESC"를 추가하여 오름차순 또는 내림차순(순서는 기본적으로 오름차순)을 지정할 수도 있습니다. 선택한 레코드는 먼저 나열된 첫 번째 열에 따라 정렬되고 두 번째 열은 정렬됩니다. 예를 들어 성, 이름 순으로 "Customers" 레코드 집합을 주문할 수 있습니다. 나열할 수 있는 열 수는 데이터 원본에 따라 달라집니다. 자세한 내용은 Windows SDK를 참조하세요.
문자열에 키워드를 ORDER BY
포함하지 마세요. 프레임워크에서 제공합니다.
SQL 절에 대한 자세한 내용은 SQL을 참조하세요. 레코드 정렬에 대한 자세한 내용은 레코드 집합: 레코드 정렬(ODBC)을 참조하세요.
예시
CCustomer rsCustSet(&m_dbCust);
// Set the sort string
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
// Run the sorted query
rsCustSet.Open(CRecordset::snapshot, _T("Customer"));
CRecordset::Move
레코드 집합 내에서 현재 레코드 포인터를 앞으로 또는 뒤로 이동합니다.
virtual void Move(
long nRows,
WORD wFetchType = SQL_FETCH_RELATIVE);
매개 변수
nRows
앞으로 또는 뒤로 이동할 행 수입니다. 양수 값은 레코드 집합의 끝쪽으로 앞으로 이동합니다. 음수 값은 시작 부분으로 뒤로 이동합니다.
wFetchType
가져올 행 집합을 Move
결정합니다. 자세한 내용은 설명을 참조하세요.
설명
값 0을 nRows
Move
전달하면 현재 레코드 Move
를 새로 고치고, 현재 AddNew
또는 Edit
모드를 종료하고, 호출되기 전이나 Edit
호출되기 전에 AddNew
현재 레코드의 값을 복원합니다.
참고 항목
레코드 집합을 통해 이동하는 경우 삭제된 레코드를 건너뛸 수 없습니다. 자세한 내용은 CRecordset::IsDeleted
를 참조하세요. 옵션 집합 Move
을 사용하여 CRecordset
skipDeletedRecords
열면 매개 변수가 0인지 nRows
어설션합니다. 이 동작은 동일한 데이터를 사용하여 다른 클라이언트 애플리케이션에서 삭제한 행의 새로 고침을 방지합니다. 에 대한 설명skipDeletedRecords
은 dwOption
매개 변수 Open
를 참조하세요.
Move
행 집합별로 레코드 집합의 위치를 변경합니다. 및 값 nRows
wFetchType
Move
에 따라 적절한 행 집합을 가져온 다음 해당 행 집합의 첫 번째 레코드를 현재 레코드로 만듭니다. 대량 행 가져오기를 구현하지 않은 경우 행 집합 크기는 항상 1입니다. 행 집합 Move
을 페치할 때 멤버 함수를 CheckRowsetError
직접 호출하여 페치로 인한 오류를 처리합니다.
전달하는 Move
값에 따라 다른 CRecordset
멤버 함수와 동일합니다. 특히 값 wFetchType
은 보다 직관적이며 현재 레코드를 이동하기 위한 기본 메서드인 멤버 함수를 나타낼 수 있습니다.
다음 표에는 가능한 값wFetchType
, 기반 wFetchType
및 기반으로 가져올 행 집합 Move
및 nRows
해당하는 모든 해당 멤버 함수가 나열되어 있습니다wFetchType
.
wFetchType | 가져온 행 집합 | 동등한 멤버 함수 |
---|---|---|
SQL_FETCH_RELATIVE (기본값) |
현재 행 집합의 첫 번째 행에서 행을 시작하는 nRows 행 집합입니다. |
|
SQL_FETCH_NEXT |
다음 행 집합입니다. nRows 는 무시됩니다. |
MoveNext |
SQL_FETCH_PRIOR |
이전 행 집합; nRows 는 무시됩니다. |
MovePrev |
SQL_FETCH_FIRST |
레코드 집합의 첫 번째 행 집합입니다. nRows 는 무시됩니다. |
MoveFirst |
SQL_FETCH_LAST |
레코드 집합의 마지막 전체 행 집합입니다. nRows 는 무시됩니다. |
MoveLast |
SQL_FETCH_ABSOLUTE |
0이면 nRows > 레코드 집합의 시작 부분에서 행을 시작하는 nRows 행 집합입니다. 0이면 nRows < 레코드 집합의 끝에서 행을 시작하는 nRows 행 집합입니다. = 0이면 nRows BOF(파일 시작) 조건이 반환됩니다. |
SetAbsolutePosition |
SQL_FETCH_BOOKMARK |
책갈피 값이 해당하는 행에서 시작하는 행 집합입니다 nRows . |
SetBookmark |
참고 항목
전달 전용 레코드 집합 Move
의 경우 에 대한 wFetchType
값 SQL_FETCH_NEXT
으로만 유효합니다.
참고 항목
레코드 집합IsBOF
의 시작 또는 끝을 지나 스크롤하거나 IsEOF
0이 아닌 값을 반환하는 경우 함수를 Move
호출하면 throw될 수 있습니다 CDBException
. 예를 들어 IsEOF
0이 아닌 값을 반환하고 IsBOF
반환하지 MoveNext
않으면 예외가 throw되지만 MovePrev
그렇지 않습니다.
참고 항목
현재 레코드가 업데이트되거나 추가되는 동안 호출 Move
하는 경우 경고 없이 업데이트가 손실됩니다.
레코드 집합 탐색에 대한 자세한 내용은 레코드 집합: 스크롤(ODBC) 및 레코드 집합: 책갈피 및 절대 위치(ODBC) 문서를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요. 관련 정보는 Windows SDK의 ODBC API 함수 SQLExtendedFetch
를 참조하세요.
예시
// rs is a CRecordset or a CRecordset-derived object
// Change the rowset size to 5
rs.SetRowsetSize(5);
// Open the recordset
rs.Open(CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch);
// Move to the first record in the recordset
rs.MoveFirst();
// Move to the sixth record
rs.Move(5);
// Other equivalent ways to move to the sixth record:
rs.Move(6, SQL_FETCH_ABSOLUTE);
rs.SetAbsolutePosition(6);
// In this case, the sixth record is the first record in the next rowset,
// so the following are also equivalent:
rs.MoveFirst();
rs.Move(1, SQL_FETCH_NEXT);
rs.MoveFirst();
rs.MoveNext();
CRecordset::MoveFirst
첫 번째 행 집합의 첫 번째 레코드를 현재 레코드로 만듭니다.
void MoveFirst();
설명
대량 행 가져오기가 구현되었는지 여부에 관계없이 항상 레코드 집합의 첫 번째 레코드가 됩니다.
레코드 집합을 연 직후에 호출 MoveFirst
할 필요가 없습니다. 이때 첫 번째 레코드(있는 경우)는 자동으로 현재 레코드입니다.
참고 항목
이 멤버 함수는 정방향 전용 레코드 집합에 유효하지 않습니다.
참고 항목
레코드 집합을 통해 이동하는 경우 삭제된 레코드를 건너뛸 수 없습니다. IsDeleted
자세한 내용은 멤버 함수를 참조하세요.
주의
레코드 집합에 레코드가 Move
없는 경우 함수를 호출하면 예외가 throw됩니다. 레코드 집합에 레코드가 있는지 여부를 확인하려면 호출 IsBOF
하고 IsEOF
.
참고 항목
현재 레코드가 Move
업데이트되거나 추가되는 동안 함수를 호출하면 경고 없이 업데이트가 손실됩니다.
레코드 집합 탐색에 대한 자세한 내용은 레코드 집합: 스크롤(ODBC) 및 레코드 집합: 책갈피 및 절대 위치(ODBC) 문서를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
예시
IsBOF
에 대한 예를 참조하세요.
CRecordset::MoveLast
마지막 전체 행 집합의 첫 번째 레코드를 현재 레코드로 만듭니다.
void MoveLast();
설명
대량 행 가져오기를 구현하지 않은 경우 레코드 집합의 행 집합 크기가 1이므로 MoveLast
레코드 집합의 마지막 레코드로 이동합니다.
참고 항목
이 멤버 함수는 정방향 전용 레코드 집합에 유효하지 않습니다.
참고 항목
레코드 집합을 통해 이동하는 경우 삭제된 레코드를 건너뛸 수 없습니다. IsDeleted
자세한 내용은 멤버 함수를 참조하세요.
주의
레코드 집합에 레코드가 Move
없는 경우 함수를 호출하면 예외가 throw됩니다. 레코드 집합에 레코드가 있는지 여부를 확인하려면 호출 IsBOF
하고 IsEOF
.
참고 항목
현재 레코드가 Move
업데이트되거나 추가되는 동안 함수를 호출하면 경고 없이 업데이트가 손실됩니다.
레코드 집합 탐색에 대한 자세한 내용은 레코드 집합: 스크롤(ODBC) 및 레코드 집합: 책갈피 및 절대 위치(ODBC) 문서를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
예시
IsBOF
에 대한 예를 참조하세요.
CRecordset::MoveNext
다음 행 집합의 첫 번째 레코드를 현재 레코드로 만듭니다.
void MoveNext();
설명
대량 행 가져오기를 구현하지 않은 경우 레코드 집합의 행 집합 크기가 1이므로 MoveNext
다음 레코드로 이동합니다.
참고 항목
레코드 집합을 통해 이동하는 경우 삭제된 레코드를 건너뛸 수 없습니다. IsDeleted
자세한 내용은 멤버 함수를 참조하세요.
주의
레코드 집합에 레코드가 Move
없는 경우 함수를 호출하면 예외가 throw됩니다. 레코드 집합에 레코드가 있는지 여부를 확인하려면 호출 IsBOF
하고 IsEOF
.
참고 항목
또한 호출MoveNext
하기 전에 호출 IsEOF
하는 것이 좋습니다. 예를 들어 레코드 집합 IsEOF
의 끝을 지나 스크롤한 경우 0이 아닌 값을 반환합니다. 후속 호출은 예외를 MoveNext
throw합니다.
참고 항목
현재 레코드가 Move
업데이트되거나 추가되는 동안 함수를 호출하면 경고 없이 업데이트가 손실됩니다.
레코드 집합 탐색에 대한 자세한 내용은 레코드 집합: 스크롤(ODBC) 및 레코드 집합: 책갈피 및 절대 위치(ODBC) 문서를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
예시
IsBOF
에 대한 예를 참조하세요.
CRecordset::MovePrev
이전 행 집합의 첫 번째 레코드를 현재 레코드로 만듭니다.
void MovePrev();
설명
대량 행 가져오기를 구현하지 않은 경우 레코드 집합의 행 집합 크기가 1이므로 MovePrev
이전 레코드로 이동합니다.
참고 항목
이 멤버 함수는 정방향 전용 레코드 집합에 유효하지 않습니다.
참고 항목
레코드 집합을 통해 이동하는 경우 삭제된 레코드를 건너뛸 수 없습니다. IsDeleted
자세한 내용은 멤버 함수를 참조하세요.
주의
레코드 집합에 레코드가 Move
없는 경우 함수를 호출하면 예외가 throw됩니다. 레코드 집합에 레코드가 있는지 여부를 확인하려면 호출 IsBOF
하고 IsEOF
.
참고 항목
또한 호출MovePrev
하기 전에 호출 IsBOF
하는 것이 좋습니다. 예를 들어 레코드 집합 IsBOF
의 시작 부분보다 먼저 스크롤한 경우 0이 아닌 값을 반환합니다. 후속 호출은 예외를 MovePrev
throw합니다.
참고 항목
현재 레코드가 Move
업데이트되거나 추가되는 동안 함수를 호출하면 경고 없이 업데이트가 손실됩니다.
레코드 집합 탐색에 대한 자세한 내용은 레코드 집합: 스크롤(ODBC) 및 레코드 집합: 책갈피 및 절대 위치(ODBC) 문서를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
예시
IsBOF
에 대한 예를 참조하세요.
CRecordset::OnSetOptions
지정된 ODBC 문에 대한 옵션(선택 시 사용)을 설정하기 위해 호출됩니다.
virtual void OnSetOptions(HSTMT hstmt);
매개 변수
hstmt
HSTMT
옵션을 설정할 ODBC 문의 값입니다.
설명
지정된 ODBC 문에 대한 옵션(선택 시 사용)을 설정하기 위한 호출 OnSetOptions
입니다. 프레임워크는 이 멤버 함수를 호출하여 레코드 집합에 대한 초기 옵션을 설정합니다. OnSetOptions
는 스크롤 가능한 커서 및 커서 동시성에 대한 데이터 원본의 지원을 결정하고 그에 따라 레코드 집합의 옵션을 설정합니다. 선택 작업에는 사용되지만 OnSetOptions
업데이트 작업에 OnSetUpdateOptions
는 사용됩니다.
드라이버 또는 데이터 원본과 관련된 옵션을 설정하려면 재정 OnSetOptions
의합니다. 예를 들어 데이터 원본이 단독 액세스를 위해 열기를 지원하는 경우 해당 기능을 활용하도록 재정 OnSetOptions
의할 수 있습니다.
커서에 대한 자세한 내용은 ODBC를 참조하세요.
CRecordset::OnSetUpdateOptions
지정된 ODBC 문에 대한 옵션(업데이트 시 사용)을 설정하기 위해 호출됩니다.
virtual void OnSetUpdateOptions(HSTMT hstmt);
매개 변수
hstmt
HSTMT
옵션을 설정할 ODBC 문의 값입니다.
설명
지정된 ODBC 문에 대한 옵션(업데이트 시 사용)을 설정하기 위한 호출 OnSetUpdateOptions
입니다. 프레임워크는 레코드 집합에서 레코드를 HSTMT
업데이트하기 위해 만든 후 이 멤버 함수를 호출합니다. 선택 작업에 OnSetUpdateOptions
는 사용되지만 OnSetOptions
업데이트 작업에는 사용됩니다. OnSetUpdateOptions
스크롤 가능한 커서 및 커서 동시성에 대한 데이터 원본의 지원을 결정하고 그에 따라 레코드 집합의 옵션을 설정합니다.
해당 문이 데이터베이스에 액세스하는 데 사용되기 전에 ODBC 문의 옵션을 설정하려면 재정 OnSetUpdateOptions
의합니다.
커서에 대한 자세한 내용은 ODBC를 참조하세요.
CRecordset::Open
테이블을 검색하거나 레코드 집합이 나타내는 쿼리를 수행하여 레코드 집합을 엽니다.
virtual BOOL Open(
UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none);
매개 변수
nOpenType
기본값 AFX_DB_USE_DEFAULT_TYPE
을 적용하거나 다음 값 enum OpenType
중 하나를 사용합니다.
CRecordset::dynaset
양방향 스크롤이 있는 레코드 집합입니다. 레코드 집합을 열면 레코드의 멤버 자격과 순서가 결정되지만 다른 사용자가 데이터 값으로 변경한 내용은 페치 작업 후에 표시됩니다. 다이나셋은 키 집합 기반 레코드 집합이라고도 합니다.CRecordset::snapshot
양방향 스크롤이 있는 정적 레코드 집합입니다. 레코드 집합을 열면 레코드의 멤버 자격 및 순서가 결정됩니다. 레코드를 페치하면 데이터 값이 결정됩니다. 다른 사용자가 변경한 내용은 레코드 집합을 닫은 다음 다시 열 때까지 표시되지 않습니다.CRecordset::dynamic
양방향 스크롤이 있는 레코드 집합입니다. 다른 사용자가 멤버 자격, 순서 지정 및 데이터 값에 대한 변경 내용을 페치 작업 후에 볼 수 있습니다. 많은 ODBC 드라이버는 이러한 유형의 레코드 집합을 지원하지 않습니다.CRecordset::forwardOnly
앞으로 스크롤만 있는 읽기 전용 레코드 집합입니다.의 경우
CRecordset
기본값은 .입니다CRecordset::snapshot
. 기본값 메커니즘을 사용하면 Visual C++ 마법사가 기본값이 다른 ODBCCRecordset
및 DAOCDaoRecordset
와 상호 작용할 수 있습니다.
이러한 레코드 집합 형식에 대한 자세한 내용은 레코드 집합(ODBC)을 참조하세요. 관련 정보는 Windows SDK에서 "블록 및 스크롤 가능한 커서 사용"을 참조하세요.
주의
요청된 형식이 지원되지 않으면 프레임워크에서 예외를 throw합니다.
lpszSQL
다음 중 하나를 포함하는 문자열 포인터입니다.
포인터입니다
NULL
.테이블의 이름입니다.
SQL
SELECT
문(선택적으로 SQLWHERE
또는ORDER BY
절 포함)입니다.CALL
미리 정의된 쿼리(저장 프로시저)의 이름을 지정하는 문입니다. 중괄호와CALL
키워드 사이에 공백을 삽입하지 않도록 주의하세요.
이 문자열에 대한 자세한 내용은 설명 섹션에서 ClassWizard의 역할에 대한 테이블 및 설명을 참조하세요 .
참고 항목
결과 집합의 열 순서는 사용자 또는 DoBulkFieldExchange
함수 재정의의 RFX 또는 Bulk RFX 함수 호출 순서와 DoFieldExchange
일치해야 합니다.
dwOptions
아래에 나열된 값의 조합을 지정할 수 있는 비트 마스크입니다. 이들 중 일부는 상호 배타적입니다. 기본값은 none
입니다.
CRecordset::none
옵션이 설정되지 않았습니다. 이 매개 변수 값은 다른 모든 값과 함께 사용할 수 없습니다. 기본적으로 레코드 집합을 업데이트Edit
하거나Delete
새 레코드AddNew
를 추가하도록 허용합니다. 호환성은 데이터 원본 및 지정한 옵션에nOpenType
따라 달라집니다. 대량 추가에 대한 최적화는 사용할 수 없습니다. 대량 행 가져오기는 구현되지 않습니다. 삭제된 레코드는 레코드 집합 탐색 중에 건너뛰지 않습니다. 책갈피는 사용할 수 없습니다. 자동 더티 필드 검사가 구현됩니다.CRecordset::appendOnly
레코드 집합을 허용Edit
하거나Delete
허용하지 않습니다. 허용만 허용AddNew
합니다. 이 옵션은 .와CRecordset::readOnly
함께 사용할 수 없습니다.CRecordset::readOnly
레코드 집합을 읽기 전용으로 엽니다. 이 옵션은 .와CRecordset::appendOnly
함께 사용할 수 없습니다.CRecordset::optimizeBulkAdd
준비된 SQL 문을 사용하여 한 번에 많은 레코드 추가를 최적화합니다. ODBC API 함수SQLSetPos
를 사용하여 레코드 집합을 업데이트하지 않는 경우에만 적용됩니다. 첫 번째 업데이트는 더티로 표시된 필드를 결정합니다. 이 옵션은 .와CRecordset::useMultiRowFetch
함께 사용할 수 없습니다.CRecordset::useMultiRowFetch
단일 페치 작업에서 여러 행을 검색할 수 있도록 대량 행 페치를 구현합니다. 이 기능은 성능을 향상하도록 설계된 고급 기능입니다. 그러나 대량 레코드 필드 교환은 .에서 지원ClassWizard
되지 않습니다. 이 옵션은 .와CRecordset::optimizeBulkAdd
함께 사용할 수 없습니다. 지정CRecordset::useMultiRowFetch
하면 옵션이CRecordset::noDirtyFieldCheck
자동으로 켜집니다(이중 버퍼링을 사용할 수 없음). 정방향 전용 레코드 집합에서는 옵션이CRecordset::useExtendedFetch
자동으로 켜집니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.CRecordset::skipDeletedRecords
레코드 집합을 탐색할 때 삭제된 모든 레코드를 건너뜁니다. 이렇게 하면 특정 상대 페치의 성능이 저하됩니다. 이 옵션은 전달 전용 레코드 집합에서 유효하지 않습니다. nRows 매개 변수를 0CRecordset::skipDeletedRecords
으로 설정하고 옵션 집합Move
을 사용하여 호출Move
하면 어설션됩니다.CRecordset::skipDeletedRecords
는 드라이버 압축과 유사합니다. 즉, 삭제된 행이 레코드 집합에서 제거됩니다. 그러나 드라이버가 레코드를 압축하는 경우 삭제한 레코드만 건너뜁니다. 레코드 집합이 열려 있는 동안 다른 사용자가 삭제한 레코드는 건너뛰지 않습니다.CRecordset::skipDeletedRecords
는 다른 사용자가 삭제한 행을 건너뜁니다.CRecordset::useBookmarks
지원되는 경우 레코드 집합에서 책갈피를 사용할 수 있습니다. 책갈피는 데이터 검색 속도가 느리지만 데이터 탐색 성능을 향상시킵니다. 전달 전용 레코드 집합에서는 유효하지 않습니다. 자세한 내용은 레코드 집합: 책갈피 및 절대 위치(ODBC)를 참조하세요.CRecordset::noDirtyFieldCheck
자동 더티 필드 확인(이중 버퍼링)을 끕니다. 이렇게 하면 성능이 향상됩니다. 그러나 필드와SetFieldNull
멤버 함수를 호출SetFieldDirty
하여 필드를 더티로 수동으로 표시해야 합니다. 클래스의 이중 버퍼링은 클래스CRecordset
CDaoRecordset
의 이중 버퍼링과 유사합니다. 그러나 개별CRecordset
필드에는 이중 버퍼링을 사용하도록 설정할 수 없습니다. 모든 필드에 대해 이중 버퍼링을 사용하도록 설정하거나 모든 필드에 대해 사용하지 않도록 설정할 수 있습니다. 옵션을CRecordset::useMultiRowFetch
CRecordset::noDirtyFieldCheck
지정하면 자동으로SetFieldDirty
SetFieldNull
설정되지만 대량 행 가져오기를 구현하는 레코드 집합에는 사용할 수 없습니다.CRecordset::executeDirect
준비된 SQL 문을 사용하지 마세요. 성능 향상을 위해 멤버 함수가Requery
호출되지 않는 경우 이 옵션을 지정합니다.CRecordset::useExtendedFetch
대신 구현SQLExtendedFetch
합니다SQLFetch
. 이는 앞으로 전용 레코드 집합에서 대량 행 페치를 구현하기 위해 설계되었습니다. 정방향 전용 레코드 집합CRecordset::useExtendedFetch
에 옵션을CRecordset::useMultiRowFetch
지정하면 자동으로 설정됩니다.CRecordset::userAllocMultiRowBuffers
사용자는 데이터에 대한 스토리지 버퍼를 할당합니다. 사용자 고유의 스토리지를 할당하려는 경우 이 옵션을CRecordset::useMultiRowFetch
사용합니다. 그렇지 않으면 프레임워크에서 필요한 스토리지를 자동으로 할당합니다. 자세한 내용은 레코드 집합: 대량으로 레코드 가져오기(ODBC)를 참조하세요.CRecordset::userAllocMultiRowBuffers
실패한 어설션에서 결과를 지정하지 않고 지정합니다CRecordset::useMultiRowFetch
.
반환 값
개체를 CRecordset
성공적으로 열면 0이 아니고, 호출된 경우 CDatabase::Open
0이면 0이 반환됩니다.
설명
레코드 집합에 정의된 쿼리를 실행하려면 이 멤버 함수를 호출해야 합니다. 호출 Open
하기 전에 레코드 집합 개체를 생성해야 합니다.
이 레코드 집합의 데이터 원본 연결은 호출 Open
하기 전에 레코드 집합을 생성하는 방법에 따라 달라집니다. 데이터 원본에 연결되지 않은 레코드 집합 생성자에 개체를 전달하는 CDatabase
경우 이 멤버 함수는 데이터베이스 개체를 여는 데 사용합니다 GetDefaultConnect
. 레코드 집합 생성자에 NULL을 전달하면 생성자가 개체를 CDatabase
생성하고 Open
데이터베이스 개체 연결을 시도합니다. 이러한 다양한 상황에서 레코드 집합 및 연결을 닫는 방법은 다음을 참조 Close
하세요.
참고 항목
개체를 통해 데이터 원본에 대한 CRecordset
액세스는 항상 공유됩니다. 클래스와 CDaoRecordset
달리 개체를 CRecordset
사용하여 전용 액세스 권한이 있는 데이터 원본을 열 수 없습니다.
일반적으로 SQL SELECT
문인 쿼리를 호출Open
할 때 다음 표에 표시된 조건에 따라 레코드를 선택합니다.
lpszSQL 매개 변수의 값 |
선택한 레코드는 다음을 통해 결정됩니다. | 예시 |
---|---|---|
NULL |
에 의해 반환된 GetDefaultSQL 문자열입니다. |
|
SQL 테이블 이름 | 테이블 목록의 모든 열 또는 DoFieldExchange DoBulkFieldExchange |
"Customer" |
미리 정의된 쿼리(저장 프로시저) 이름 | 쿼리가 반환하도록 정의된 열입니다. | "{call OverDueAccts}" |
SELECT column-list FROM table-list |
지정한 테이블의 지정된 열입니다. | "SELECT CustId, CustName FROM Customer" |
주의
SQL 문자열에 추가 공백을 삽입하지 마세요. 예를 들어 중괄호와 CALL
키워드 사이에 공백을 삽입하면 MFC는 SQL 문자열을 테이블 이름으로 잘못 해석하고 문에 SELECT
통합하여 예외가 throw됩니다. 마찬가지로 미리 정의된 쿼리에서 출력 매개 변수를 사용하는 경우 중괄호와 '' 기호 사이에 공백을 삽입하지 마세요. 마지막으로 문에서 중괄호 CALL
앞에 공백을 삽입하거나 문의 키워드 SELECT
앞에 공백을 SELECT
삽입하면 안 됩니다.
일반적인 절차는 전달 NULL
하는 것입니다Open
. 이 경우 Open
GetDefaultSQL을 호출합니다. 파생 CRecordset
클래스 GetDefaultSQL
를 사용하는 경우 지정 ClassWizard
한 테이블 이름을 지정합니다. 대신 매개 변수에 lpszSQL
다른 정보를 지정할 수 있습니다.
전달하는 Open
것이 무엇이든 간에 쿼리에 대한 최종 SQL 문자열을 생성하고(문자열에 전달한 문자열에 SQL WHERE
및 ORDER BY
절이 추가될 lpszSQL
수 있음) 쿼리를 실행합니다. 호출Open
한 후 호출 GetSQL
하여 생성된 문자열을 검사할 수 있습니다. 레코드 집합이 SQL 문을 생성하고 레코드를 선택하는 방법에 대한 자세한 내용은 레코드 집합: 레코드 집합에서 레코드를 선택하는 방법(ODBC)을 참조하세요.
레코드 집합 클래스의 필드 데이터 멤버는 선택한 데이터의 열에 바인딩됩니다. 레코드가 반환되면 첫 번째 레코드가 현재 레코드가 됩니다.
필터 또는 정렬과 같은 레코드 집합에 대한 옵션을 설정하려면 레코드 집합 개체를 생성한 후 호출 Open
하기 전에 이를 지정합니다. 레코드 집합이 이미 열려 있는 후 레코드 집합의 레코드를 새로 고치려면 다음을 호출합니다 Requery
.
자세한 내용은 레코드 집합(ODBC), 레코드 집합: 레코드 집합이 레코드를 선택하는 방법(ODBC) 및 레코드 집합: ODBC(레코드 집합 만들기 및 닫기)를 참조하세요.
예시
다음 코드 예제에서는 다른 형태의 호출을 보여 줍니다 Open
.
// 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();
CRecordset::RefreshRowset
현재 행 집합의 행에 대한 데이터 및 상태를 업데이트합니다.
void RefreshRowset(
WORD wRow,
WORD wLockType = SQL_LOCK_NO_CHANGE);
매개 변수
wRow
현재 행 집합에 있는 행의 1부터 시작하는 위치입니다. 이 값은 0부터 행 집합의 크기까지 다양할 수 있습니다.
wLockType
행을 새로 고친 후 잠그는 방법을 나타내는 값입니다. 자세한 내용은 설명을 참조하세요.
설명
값을 0 wRow
으로 전달하면 행 집합의 모든 행이 새로 고쳐집니다.
사용RefreshRowset
하려면 멤버 함수에서 옵션을 Open
지정하여 대량 행 페치를 CRecordset::useMulitRowFetch
구현해야 합니다.
RefreshRowset
는 ODBC API 함수 SQLSetPos
를 호출합니다. 매개 변수는 wLockType
실행 후 SQLSetPos
행의 잠금 상태를 지정합니다. 다음 표에서는 에 대한 가능한 값을 설명합니다 wLockType
.
wLockType | 설명 |
---|---|
SQL_LOCK_NO_CHANGE (기본값) |
드라이버 또는 데이터 원본은 행이 호출되기 전 RefreshRowset 과 동일한 잠금 또는 잠금 해제 상태인지 확인합니다. |
SQL_LOCK_EXCLUSIVE |
드라이버 또는 데이터 원본은 행을 단독으로 잠급 수 있습니다. 모든 데이터 원본이 이러한 유형의 잠금을 지원하는 것은 아닙니다. |
SQL_LOCK_UNLOCK |
드라이버 또는 데이터 원본이 행의 잠금을 해제합니다. 모든 데이터 원본이 이러한 유형의 잠금을 지원하는 것은 아닙니다. |
자세한 내용은 SQLSetPos
Windows SDK를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
CRecordset::Requery
레코드 집합을 다시 빌드(새로 고침)합니다.
virtual BOOL Requery();
반환 값
레코드 집합이 성공적으로 다시 작성되었으면 0이 아닌 경우 그렇지 않으면 0입니다.
설명
레코드가 반환되면 첫 번째 레코드가 현재 레코드가 됩니다.
레코드 집합에 사용자 또는 다른 사용자가 데이터 원본에 추가하는 추가 및 삭제가 반영되도록 하려면 호출 Requery
하여 레코드 집합을 다시 빌드해야 합니다. 레코드 집합이 다이나셋인 경우 사용자 또는 다른 사용자가 기존 레코드에 적용한 업데이트를 자동으로 반영합니다(추가는 아님). 레코드 집합이 스냅샷인 경우 다른 사용자의 편집 내용과 추가 및 삭제를 반영하도록 호출 Requery
해야 합니다.
다이나셋 또는 스냅샷의 경우 새 필터 또는 정렬 또는 새 매개 변수 값을 사용하여 레코드 집합을 다시 작성하려는 경우 언제든지 호출 Requery
합니다. 호출Requery
하기 전에 새 값을 m_strFilter
m_strSort
할당하여 새 필터 또는 정렬 속성을 설정합니다. 호출 Requery
하기 전에 매개 변수 데이터 멤버에 새 값을 할당하여 새 매개 변수를 설정합니다. 필터 및 정렬 문자열이 변경되지 않은 경우 쿼리를 다시 사용하여 성능을 향상시킬 수 있습니다.
레코드 집합을 다시 빌드하는 데 실패하면 레코드 집합이 닫힙니다. 호출 Requery
하기 전에 멤버 함수를 호출 CanRestart
하여 레코드 집합을 다시 쿼리할 수 있는지 여부를 확인할 수 있습니다. CanRestart
는 성공한다고 Requery
보장하지 않습니다.
주의
호출한 후에만 호출 Requery
Open
합니다.
예시
다음은 레코드 집합을 다시 빌드하여 다른 정렬 순서를 적용하는 예제입니다.
CCustomer rsCustSet(&m_dbCust);
// Open the recordset
rsCustSet.Open();
// Use the recordset ...
// Set the sort order and Requery the recordset
rsCustSet.m_strSort = _T("L_Name, ContactFirstName");
if (!rsCustSet.CanRestart())
return; // Unable to requery
if (!rsCustSet.Requery())
// Requery failed, so take action
AfxMessageBox(_T("Requery failed!"));
CRecordset::SetAbsolutePosition
레코드 집합을 지정된 레코드 번호에 해당하는 레코드에 배치합니다.
void SetAbsolutePosition(long nRows);
매개 변수
nRows
레코드 집합의 현재 레코드에 대한 1부터 시작하는 서수 위치입니다.
설명
SetAbsolutePosition
는 이 서수 위치에 따라 현재 레코드 포인터를 이동합니다.
참고 항목
이 멤버 함수는 정방향 전용 레코드 집합에서 유효하지 않습니다.
ODBC 레코드 집합의 경우 절대 위치 설정 1은 레코드 집합의 첫 번째 레코드를 나타냅니다. 0의 설정은 BOF(파일의 시작) 위치를 나타냅니다.
음수 값을 .에 SetAbsolutePosition
전달할 수도 있습니다. 이 경우 레코드 집합의 위치는 레코드 집합의 끝에서 평가됩니다. 예를 들어 SetAbsolutePosition( -1 )
현재 레코드 포인터를 레코드 집합의 마지막 레코드로 이동합니다.
참고 항목
절대 위치는 서로게이트 레코드 번호로 사용할 수 없습니다. 이전 레코드가 삭제될 때 레코드의 위치가 변경되므로 책갈피는 여전히 지정된 위치를 유지하고 반환하는 권장 방법입니다. 또한 레코드 집합 내의 개별 레코드 순서가 절을 사용하여 ORDER BY
SQL 문으로 만들어지지 않는 한 보장되지 않으므로 레코드 집합이 다시 만들어지면 지정된 레코드의 절대 위치가 동일하다는 것을 확신할 수 없습니다.
레코드 집합 탐색 및 책갈피에 대한 자세한 내용은 레코드 집합: 스크롤(ODBC) 및 레코드 집합: 책갈피 및 절대 위치(ODBC) 문서를 참조하세요.
CRecordset::SetBookmark
지정된 책갈피가 포함된 레코드에 레코드 집합을 배치합니다.
void SetBookmark(const CDBVariant& varBookmark);
매개 변수
varBookmark
특정 레코드의 CDBVariant
책갈피 값을 포함하는 개체에 대한 참조입니다.
설명
레코드 집합에서 책갈피가 지원되는지 확인하려면 .를 호출 CanBookmark
합니다. 지원되는 경우 책갈피를 사용할 수 있도록 하려면 멤버 함수의 Open
매개 변수에서 dwOptions
옵션을 설정 CRecordset::useBookmarks
해야 합니다.
참고 항목
책갈피가 지원되지 않거나 사용할 수 없는 경우 호출 SetBookmark
하면 예외가 throw됩니다. 책갈피는 전달 전용 레코드 집합에서 지원되지 않습니다.
먼저 현재 레코드의 책갈피를 검색하려면 책갈피 값을 개체에 저장하는 호출을 CDBVariant
호출GetBookmark
합니다. 나중에 저장된 책갈피 값을 사용하여 호출 SetBookmark
하여 해당 레코드로 돌아갈 수 있습니다.
참고 항목
특정 레코드 집합 작업 후에는 호출 SetBookmark
하기 전에 책갈피 지속성을 확인해야 합니다. 예를 들어 책갈피를 검색한 다음 호출Requery
하는 경우 책갈 GetBookmark
피가 더 이상 유효하지 않을 수 있습니다. 호출 CDatabase::GetBookmarkPersistence
하여 안전하게 호출 SetBookmark
할 수 있는지 확인합니다.
책갈피 및 레코드 집합 탐색에 대한 자세한 내용은 Recordset: ODBC(책갈피 및 절대 위치) 및 레코드 집합: 스크롤(ODBC) 문서를 참조하세요.
CRecordset::SetFieldDirty
레코드 집합의 필드 데이터 멤버에 변경되거나 변경되지 않은 것으로 플래그를 지정합니다.
void SetFieldDirty(void* pv, BOOL bDirty = TRUE);
매개 변수
pv
레코드 집합 또는 NULL
에 있는 필드 데이터 멤버의 주소를 포함합니다. 이 경우 NULL
레코드 집합의 모든 필드 데이터 멤버에 플래그가 지정됩니다. (C++ NULL
는 데이터베이스 용어의 Null과 동일하지 않습니다. 즉, "값이 없습니다.")
bDirty
TRUE
필드 데이터 멤버가 "dirty"(변경됨)로 플래그가 지정되면 입니다. 그렇지 않으면 FALSE
필드 데이터 멤버에 "clean"(변경되지 않음)으로 플래그가 지정됩니다.
설명
필드를 변경되지 않은 것으로 표시하면 필드가 업데이트되지 않고 SQL 트래픽이 줄어듭니다.
참고 항목
이 멤버 함수는 대량 행 페치를 사용하는 레코드 집합에는 적용되지 않습니다. 대량 행 페치를 SetFieldDirty
구현한 경우 어설션이 실패합니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
프레임워크는 변경된 필드 데이터 멤버를 표시하여 RFX(레코드 필드 교환) 메커니즘을 통해 데이터 원본의 레코드에 기록되도록 합니다. 필드 값을 변경하면 일반적으로 필드가 자동으로 더러워지므로 직접 호출 SetFieldDirty
할 필요가 거의 없지만 필드 데이터 멤버에 있는 값에 관계없이 열을 명시적으로 업데이트하거나 삽입해야 하는 경우가 있습니다.
함수의 첫 번째 인수에 사용하면 NULL
필드가 아닌 param
필드에만 함수가 outputColumn
적용됩니다. 예를 들어 호출
SetFieldNull(NULL);
은 필드만 outputColumn
을 설정하며 param
NULL
, 필드는 영향을 받지 않습니다.
필드에서 작업 param
하려면 다음과 같이 작업하려는 개인의 param
실제 주소를 제공해야 합니다.
SetFieldNull(&m_strParam);
즉, 필드와 outputColumn
마찬가지로 모든 param
필드를 NULL
설정할 수 없습니다.
CRecordset::SetFieldNull
레코드 집합의 필드 데이터 멤버를 Null(특히 값 없음) 또는 Null이 아닌 것으로 플래그를 지정합니다.
void SetFieldNull(void* pv, BOOL bNull = TRUE);
매개 변수
pv
레코드 집합 또는 NULL
에 있는 필드 데이터 멤버의 주소를 포함합니다. 이 경우 NULL
레코드 집합의 모든 필드 데이터 멤버에 플래그가 지정됩니다. (C++ NULL
는 데이터베이스 용어의 Null과 동일하지 않습니다. 즉, "값이 없습니다.")
bNull
필드 데이터 멤버에 값이 없는 것으로 플래그가 지정될 경우 0이 아닌 값(Null)입니다. 필드 데이터 멤버가 Null이 아닌 것으로 플래그를 지정해야 하는 경우 그렇지 않으면 0입니다.
설명
레코드 집합에 새 레코드를 추가하면 모든 필드 데이터 멤버가 처음에 Null 값으로 설정되고 "더티"(변경됨)로 플래그가 지정됩니다. 데이터 원본에서 레코드를 검색할 때 해당 열에 이미 값이 있거나 Null입니다.
참고 항목
대량 행 가져오기를 사용하는 레코드 집합에서는 이 멤버 함수를 호출하지 마세요. 대량 행 페치를 구현한 경우 호출 SetFieldNull
하면 어설션이 실패합니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
현재 레코드의 필드를 값이 없는 것으로 구체적으로 지정하려면 set을 사용하여 Null SetFieldNull
bNull
로 플래그를 지정합니다 TRUE
. 필드가 이전에 Null로 표시되어 있고 이제 값을 제공하려는 경우 새 값을 설정합니다. 을 사용하여 Null 플래그 SetFieldNull
를 제거할 필요가 없습니다. 필드가 Null일 수 있는지 여부를 확인하려면 .를 호출 IsFieldNullable
합니다.
함수의 첫 번째 인수에 사용하면 NULL
필드가 아닌 param
필드에만 함수가 outputColumn
적용됩니다. 예를 들어 호출
SetFieldNull(NULL);
은 필드만 outputColumn
을 설정하며 param
NULL
, 필드는 영향을 받지 않습니다.
필드에서 작업 param
하려면 다음과 같이 작업하려는 개인의 param
실제 주소를 제공해야 합니다.
SetFieldNull(&m_strParam);
즉, 필드와 outputColumn
마찬가지로 모든 param
필드를 NULL
설정할 수 없습니다.
참고 항목
매개 변수를 Null로 설정할 때 레코드 집합이 열리기 SetFieldNull
전에 호출하면 어설션이 발생합니다. 이 경우 호출 SetParamNull
합니다.
SetFieldNull
는 .를 통해 DoFieldExchange
구현됩니다.
CRecordset::SetLockingMode
잠금 모드를 "낙관적" 잠금(기본값) 또는 "비관적" 잠금으로 설정합니다. 업데이트를 위해 레코드가 잠기는 방법을 결정합니다.
void SetLockingMode(UINT nMode);
매개 변수
nMode
다음 값 enum LockMode
중 하나를 포함합니다.
optimistic
낙관적 잠금은 호출 중에만 업데이트되는 레코드를 잠급 수 있습니다Update
.pessimistic
비관적 잠금은 호출되는 즉시Edit
레코드를 잠그고 호출이 완료되거나 새 레코드로 이동할 때까지Update
잠깁니다.
설명
레코드 집합이 업데이트에 사용하는 두 가지 레코드 잠금 전략 중 어느 것을 지정해야 하는 경우 이 멤버 함수를 호출합니다. 기본적으로 레코드 집합의 잠금 모드는 optimistic
. 이를 보다 신중한 pessimistic
잠금 전략으로 변경할 수 있습니다. SetLockingMode
레코드 집합 개체를 생성하고 연 후 호출하지만 호출하기 전에 호출Edit
합니다.
CRecordset::SetParamNull
매개 변수를 Null(특히 값 없음) 또는 Null이 아닌 매개 변수로 플래그를 지정합니다.
void SetParamNull(
int nIndex,
BOOL bNull = TRUE);
매개 변수
nIndex
매개 변수의 인덱스(0부터 시작하는 인덱스)입니다.
bNull
기본값인 경우 TRUE
매개 변수는 Null로 플래그가 지정됩니다. 그렇지 않으면 매개 변수에 Null이 아닌 플래그가 지정됩니다.
설명
달리 SetFieldNull
레코드 집합을 열기 전에 호출 SetParamNull
할 수 있습니다.
SetParamNull
는 일반적으로 미리 정의된 쿼리(저장 프로시저)와 함께 사용됩니다.
CRecordset::SetRowsetCursorPosition
커서를 현재 행 집합 내의 행으로 이동합니다.
void SetRowsetCursorPosition(WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE);
매개 변수
wRow
현재 행 집합에 있는 행의 1부터 시작하는 위치입니다. 이 값의 범위는 1에서 행 집합의 크기까지입니다.
wLockType
행을 새로 고친 후 잠그는 방법을 나타내는 값입니다. 자세한 내용은 설명을 참조하세요.
설명
대량 행 페치를 구현할 때 레코드는 행 집합에 의해 검색됩니다. 여기서 페치된 행 집합의 첫 번째 레코드는 현재 레코드입니다. 행 집합 내의 다른 레코드를 현재 레코드로 만들려면 .를 호출합니다 SetRowsetCursorPosition
. 예를 들어 멤버 함수와 GetFieldValue
결합하여 SetRowsetCursorPosition
레코드 집합의 레코드에서 데이터를 동적으로 검색할 수 있습니다.
사용SetRowsetCursorPosition
하려면 멤버 함수에서 매개 변수 옵션을 dwOptions
지정하여 CRecordset::useMultiRowFetch
대량 행 페치를 Open
구현해야 합니다.
SetRowsetCursorPosition
는 ODBC API 함수 SQLSetPos
를 호출합니다. 매개 변수는 wLockType
실행 후 SQLSetPos
행의 잠금 상태를 지정합니다. 다음 표에서는 에 대한 가능한 값을 설명합니다 wLockType
.
wLockType |
설명 |
---|---|
SQL_LOCK_NO_CHANGE (기본값) |
드라이버 또는 데이터 원본은 행이 호출되기 전 SetRowsetCursorPosition 과 동일한 잠금 또는 잠금 해제 상태인지 확인합니다. |
SQL_LOCK_EXCLUSIVE |
드라이버 또는 데이터 원본은 행을 단독으로 잠급 수 있습니다. 모든 데이터 원본이 이러한 유형의 잠금을 지원하는 것은 아닙니다. |
SQL_LOCK_UNLOCK |
드라이버 또는 데이터 원본이 행의 잠금을 해제합니다. 모든 데이터 원본이 이러한 유형의 잠금을 지원하는 것은 아닙니다. |
자세한 내용은 SQLSetPos
Windows SDK를 참조하세요. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
CRecordset::SetRowsetSize
인출하는 동안 검색할 레코드 수를 지정합니다.
virtual void SetRowsetSize(DWORD dwNewRowsetSize);
매개 변수
dwNewRowsetSize
지정된 인출 중에 검색할 행 수입니다.
설명
이 가상 멤버 함수는 대량 행 페치를 사용할 때 단일 페치 중에 검색할 행 수를 지정합니다. 대량 행 페치를 구현하려면 멤버 함수의 Open
매개 변수에서 dwOptions
옵션을 설정 CRecordset::useMultiRowFetch
해야 합니다.
참고 항목
대량 행 페치를 구현하지 않고 호출 SetRowsetSize
하면 어설션이 실패합니다.
호출하기 전에 호출 SetRowsetSize
Open
하여 처음에 레코드 집합의 행 집합 크기를 설정합니다. 대량 행 가져오기를 구현할 때 기본 행 집합 크기는 25입니다.
참고 항목
를 호출할 때는 주의해야 합니다 SetRowsetSize
. 데이터에 대한 스토리지를 수동으로 할당하는 경우(dwOptions 매개 변수 Open
옵션에 CRecordset::userAllocMultiRowBuffers
지정된 대로) 호출 SetRowsetSize
후 커서 탐색 작업을 수행하기 전에 이러한 스토리지 버퍼를 다시 할당해야 하는지 확인해야 합니다.
행 집합 크기에 대한 현재 설정을 가져오려면 .를 호출 GetRowsetSize
합니다.
대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
CRecordset::Update
데이터 원본에 AddNew
새 데이터 또는 편집된 데이터를 저장하여 또는 Edit
작업을 완료합니다.
virtual BOOL Update();
반환 값
하나의 레코드가 성공적으로 업데이트된 경우 0이 아닌 경우 그렇지 않으면 열이 변경되지 않은 경우 0입니다. 업데이트된 레코드가 없거나 둘 이상의 레코드가 업데이트된 경우 예외가 throw됩니다. 데이터 원본의 다른 오류에 대해서도 예외가 throw됩니다.
설명
또는 Edit
멤버 함수를 호출한 후 이 멤버 함수를 AddNew
호출합니다. 이 호출은 또는 Edit
작업을 완료 AddNew
하는 데 필요합니다.
참고 항목
대량 행 페치를 구현한 경우 호출 Update
할 수 없습니다. 이로 인해 어설션이 실패합니다. 클래스 CRecordset
는 대량 데이터 행을 업데이트하는 메커니즘을 제공하지 않지만 ODBC API SQLSetPos
함수를 사용하여 고유한 함수를 작성할 수 있습니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
둘 다 AddNew
데이터 Edit
원본에 저장하기 위해 추가되거나 편집된 데이터가 배치되는 편집 버퍼를 준비합니다. Update
는 데이터를 저장합니다. 변경된 것으로 표시되거나 검색된 필드만 업데이트됩니다.
데이터 원본이 트랜잭션을 지원하는 경우 트랜잭션의 일부(및 해당 AddNew
Edit
또는 호출)를 호출할 수 있습니다Update
. 트랜잭션에 대한 자세한 내용은 트랜잭션(ODBC)을 참조하세요.
주의
먼저 호출하거나 호출하지 않고 호출 Update
Update
AddNew
Edit
CDBException
하면 . 호출 AddNew
하거나 작업을 호출 Move
하기 전에 또는 레코드 집합 또는 데이터 원본 연결을 닫기 전에 호출 Update
해야 Edit
합니다. 그렇지 않으면 알림 없이 변경 내용이 손실됩니다.
오류 처리 Update
에 대한 자세한 내용은 Recordset: How Recordsets Update Records(ODBC)를 참조하세요.
예시
참조 트랜잭션: 레코드 집합에서 트랜잭션 수행(ODBC).