레코드 집합: AddNew, Edit 및 Delete의 작동 방식(ODBC)
이 항목은 MFC ODBC 클래스에 적용됩니다.
이 항목에서는 클래스 CRecordset
의 AddNew
, Edit
및 Delete
멤버 함수가 작동하는 방법을 설명합니다. 다음 내용을 다룹니다.
참고 항목
이 토픽은 대량 행 페치가 구현되지 않은 CRecordset
에서 파생된 개체에 적용됩니다. 대량 행 가져오기를 사용하는 경우 레코드 집합: 대량으로 레코드 가져오기(ODBC)를 참조하세요.
추가 기능으로, 업데이트 작업에서 RFX의 해당 역할을 설명하는 레코드 필드 교환: RFX 작동 방식을 읽을 수 있습니다.
레코드 추가
레코드 집합에 새 레코드를 추가하려면 레코드 집합의 AddNew 멤버 함수를 호출하고, 새 레코드의 필드 데이터 멤버 값을 설정하고, Update 멤버 함수를 호출하여 레코드를 데이터 원본에 씁니다.
호출 AddNew
의 전제 조건으로 레코드 집합을 읽기 전용으로 열지 않아야 합니다. CanUpdate
및 CanAppend
멤버 함수를 사용하면 이러한 조건을 확인할 수 있습니다.
호출 AddNew
할 때:
편집 버퍼의 레코드가 저장되므로 작업이 취소되면 해당 내용을 복원할 수 있습니다.
필드 데이터 멤버는 플래그가 지정되므로 나중에 변경 내용을 검색할 수 있습니다. 필드 데이터 멤버도 정리(변경되지 않음)로 표시되고 Null로 설정됩니다.
호출 AddNew
후 편집 버퍼는 값으로 채울 준비가 된 비어 있는 새 레코드를 나타냅니다. 이렇게 하려면 값을 할당하여 수동으로 설정합니다. 필드에 대한 실제 데이터 값을 지정하는 대신 Null 값을 지정하도록 호출 SetFieldNull
할 수 있습니다.
변경 내용을 커밋하려면 .를 호출 Update
합니다. 새 레코드를 호출 Update
하는 경우:
ODBC 드라이버가
::SQLSetPos
ODBC API 함수를 지원하는 경우 MFC는 이 함수를 사용하여 데이터 원본에 레코드를 추가합니다. 이::SQLSetPos
경우 MFC는 SQL 문을 생성하고 처리할 필요가 없으므로 레코드를 더 효율적으로 추가할 수 있습니다.사용할 수 없는 경우
::SQLSetPos
MFC는 다음을 수행합니다.변경 내용이 검색되지
Update
않으면 아무 것도 수행하지 않고 0을 반환합니다.변경
Update
내용이 있는 경우 SQL INSERT 문을 생성합니다. 모든 더티 필드 데이터 멤버가 나타내는 열이 INSERT 문에 나열됩니다. 열을 강제로 포함하려면 SetFieldDirty 멤버 함수를 호출합니다.SetFieldDirty( &m_dataMember, TRUE );
Update
는 새 레코드 를 커밋합니다. 트랜잭션이 진행되지 않는 한 INSERT 문이 실행되고 레코드가 데이터 원본의 테이블에 커밋됩니다(스냅샷이 아닌 경우 레코드 집합).저장된 레코드가 편집 버퍼로 복원됩니다. INSERT 문이 성공적으로 실행되었는지 여부에 관계없이 호출 전
AddNew
의 현재 레코드가 다시 현재 레코드입니다.
팁
새 레코드를 완전히 제어하려면 다음 방법을 사용합니다. 값이 있는 필드의 값을 설정한 다음 필드 및 매개 변수 TRUE(기본값)를 사용하여 Null
SetFieldNull
로 유지되는 필드를 명시적으로 설정합니다. 필드가 데이터 원본에 기록되지 않도록 하려면 필드 및 FALSE 매개 변수에 대한 포인터를 사용하여 호출SetFieldDirty
하고 필드 값을 수정하지 않습니다. 필드가 Null일 수 있는지 여부를 확인하려면 를 호출IsFieldNullable
합니다.팁
레코드 집합 데이터 멤버가 값을 변경하는 시기를 감지하기 위해 MFC는 레코드 집합에 저장할 수 있는 각 데이터 형식에 적합한 PSEUDO_NULL 값을 사용합니다. 필드를 PSEUDO_NULL 값으로 명시적으로 설정해야 하고 필드가 이미 Null로 표시된 경우 첫 번째 매개 변수의 필드 주소와 두 번째 매개 변수의 FALSE를 전달하여 호출
SetFieldNull
해야 합니다.
추가된 레코드의 표시 유형
레코드 집합에 추가된 레코드는 언제 표시되나요? 다음 두 가지에 따라 추가된 레코드가 표시되고 표시되지 않는 경우도 있습니다.
드라이버가 수행할 수 있는 기능
프레임워크에서 활용할 수 있는 기능
ODBC 드라이버가 ODBC API 함수를 ::SQLSetPos
지원하는 경우 MFC는 이 함수를 사용하여 레코드를 추가합니다. 를 사용하면 ::SQLSetPos
추가된 레코드가 모든 업트레팅 가능한 MFC 레코드 집합에 표시됩니다. 함수를 지원하지 않으면 추가된 레코드가 표시되지 않으며 이를 보려면 호출 Requery
해야 합니다. 사용 ::SQLSetPos
도 더 효율적입니다.
기존 레코드 편집
레코드 집합에서 기존 레코드를 편집하려면 레코드로 스크롤하고, 레코드 집합의 멤버 편집 함수를 호출하고, 새 레코드의 필드 데이터 멤버 값을 설정하고, 업데이트 멤버 함수를 호출하여 변경된 레코드를 데이터 원본에 씁니다.
호출 Edit
을 위한 전제 조건으로 레코드 집합을 업다이블하고 레코드에 저장해야 합니다. CanUpdate
및 IsDeleted
멤버 함수를 사용하면 이러한 조건을 확인할 수 있습니다. 현재 레코드도 아직 삭제되지 않았어야 하며 레코드 집합에 레코드가 있어야 합니다(둘 다 IsBOF
반환 IsEOF
0).
호출 Edit
하면 편집 버퍼(현재 레코드)의 레코드가 저장됩니다. 저장된 레코드의 값은 나중에 필드가 변경되었는지 여부를 감지하는 데 사용됩니다.
호출 Edit
한 후에도 편집 버퍼는 현재 레코드를 나타내지만 이제 필드 데이터 멤버에 대한 변경 내용을 수락할 준비가 되었습니다. 레코드를 변경하려면 편집하려는 필드 데이터 멤버의 값을 수동으로 설정합니다. 필드에 대한 실제 데이터 값을 지정하는 대신 Null 값을 지정하도록 호출 SetFieldNull
할 수 있습니다. 변경 내용을 커밋하려면 .를 호출 Update
합니다.
팁
모드를 벗어나 AddNew
려면 Edit
매개 변수 AFX_MOVE_REFRESH 사용하여 호출 Move
합니다.
호출 Update
의 전제 조건으로 레코드 집합은 비어 있지 않아야 하며 현재 레코드는 삭제되지 않아야 합니다. IsBOF
, IsEOF
그리고 IsDeleted
모두 0을 반환해야 합니다.
편집된 레코드를 호출 Update
하는 경우:
ODBC 드라이버가
::SQLSetPos
ODBC API 함수를 지원하는 경우 MFC는 이 함수를 사용하여 데이터 원본의 레코드를 업데이트합니다. 드라이버는::SQLSetPos
편집 버퍼를 서버의 해당 레코드와 비교하여 두 레코드가 다른 경우 서버의 레코드를 업데이트합니다. 이::SQLSetPos
경우 MFC는 SQL 문을 생성하고 처리할 필요가 없으므로 레코드를 보다 효율적으로 업데이트할 수 있습니다.- 또는 -
사용할 수 없는 경우
::SQLSetPos
MFC는 다음을 수행합니다.변경
Update
내용이 없으면 아무 것도 수행하지 않고 0을 반환합니다.변경
Update
내용이 있는 경우 SQL UPDATE 문을 생성합니다. UPDATE 문에 나열된 열은 변경된 필드 데이터 멤버를 기반으로 합니다.Update
변경 내용을 커밋합니다. UPDATE 문을 실행하면 데이터 원본에서 레코드가 변경되지만 트랜잭션이 진행 중인 경우 커밋되지 않습니다(트랜잭션: 트랜잭션이 업데이트에 미치는 영향에 대한 자세한 내용은 ODBC(Recordset) 에서 트랜잭션 수행 참조). ODBC는 레코드의 복사본을 유지하며 이는 변경도 합니다.프로세스
AddNew
와 달리 프로세스는Edit
저장된 레코드를 복원하지 않습니다. 편집된 레코드는 현재 레코드로 유지됩니다.
주의
레코드 집합을 호출
Update
하여 업데이트할 준비가 되면 레코드 집합에 테이블의 기본 키를 구성하는 모든 열(또는 테이블에 있는 고유 인덱스의 모든 열 또는 행을 고유하게 식별할 수 있는 충분한 열)이 포함됩니다. 경우에 따라 프레임워크는 레코드 집합에서 선택한 열만 사용하여 업데이트할 테이블의 레코드를 식별할 수 있습니다. 필요한 모든 열이 없으면 테이블에서 여러 레코드가 업데이트될 수 있습니다. 이 경우 호출할 때Update
프레임워크에서 예외를 throw합니다.팁
이전에 함수를 호출
AddNew
한Edit
후 호출한 후 호출Update
하기 전에 편집 버퍼가 저장된 레코드로 새로 고쳐진 경우 진행 중인 새 레코드나 편집된 레코드를 대체합니다. 이 동작은 진행 중인 레코드에 오류가 있다고 판단되면 단순히 호출하거나AddNew
다시 호출Edit
하여 중단AddNew
하거나Edit
새 동작을 시작하는 방법을 제공합니다.
레코드 삭제
레코드 집합에서 레코드를 삭제하려면 레코드로 스크롤하고 레코드 집합의 Delete 멤버 함수를 호출해야 합니다. 와 달리 AddNew
, Delete
에 대한 일치 호출Update
Edit
이 필요하지 않습니다.
호출 Delete
의 전제 조건으로 레코드 집합을 업다이블해야 하며 레코드에 있어야 합니다. CanUpdate
, IsBOF
, IsEOF
및 IsDeleted
멤버 함수를 사용하면 이러한 조건을 확인할 수 있습니다.
호출 Delete
할 때:
ODBC 드라이버가
::SQLSetPos
ODBC API 함수를 지원하는 경우 MFC는 이 함수를 사용하여 데이터 원본의 레코드를 삭제합니다. 사용::SQLSetPos
은 일반적으로 SQL을 사용하는 것보다 더 효율적입니다.- 또는 -
사용할 수 없는 경우
::SQLSetPos
MFC는 다음을 수행합니다.편집 버퍼의 현재 레코드는 다음과 같이
AddNew
Edit
백업되지 않습니다.Delete
는 레코드를 제거하는 SQL DELETE 문을 생성합니다.편집 버퍼의 현재 레코드는 다음과 같이
AddNew
Edit
저장되지 않습니다.Delete
는 삭제를 커밋합니다. DELETE 문을 실행합니다. 레코드는 데이터 원본에서 삭제된 것으로 표시되고 레코드가 스냅샷인 경우 ODBC에서 표시됩니다.삭제된 레코드의 값은 여전히 레코드 집합의 필드 데이터 멤버에 있지만 필드 데이터 멤버는 Null로 표시되고 레코드 집합의
IsDeleted
멤버 함수는 0이 아닌 값을 반환합니다.
참고 항목
레코드를 삭제한 후 다른 레코드로 스크롤하여 편집 버퍼를 새 레코드의 데이터로 다시 채워야 합니다. 다시 호출하거나 호출
Delete
Edit
하는 것은 오류입니다.
업데이트 작업에 사용되는 SQL 문에 대한 자세한 내용은 SQL을 참조하세요.