레코드 집합: 업데이트에 대한 추가 정보(ODBC)
이 항목은 MFC ODBC 클래스에 적용됩니다.
이 항목에서는 다음 내용을 설명합니다.
트랜잭션과 같은 다른 작업이 업데이트에 미치는 영향
사용자의 업데이트 및 다른 사용자의 업데이트입니다.
참고 항목
이 토픽은 대량 행 페치가 구현되지 않은 CRecordset
에서 파생된 개체에 적용됩니다. 대량 행 페치를 구현한 경우 일부 정보가 적용되지 않습니다. 예를 들어 , , Edit
Delete
및 Update
멤버 함수를 AddNew
호출할 수는 없지만 트랜잭션을 수행할 수 있습니다. 대량 행 페치 에 대한 자세한 내용은 레코드 집합: 대량 레코드 가져오기(ODBC)를 참조하세요.
다른 작업이 업데이트 미치는 영향
업데이트는 트랜잭션을 완료하기 전에 레코드 집합을 닫고 트랜잭션을 완료하기 전에 스크롤하여 업데이트 시 적용되는 트랜잭션의 영향을 받습니다.
트랜잭션이 업데이트 미치는 영향
AddNew
Edit
CDatabase의 멤버 함수가 Delete
CRecordset의 업데이트 함수와 Rollback
어떻게 BeginTrans
CommitTrans
작동하는지 이해해야 합니다.
기본적으로 호출할 때 데이터 원본에 AddNew
대한 호출 및 Edit
영향을 즉시 적용 Update
합니다. Delete
호출은 즉시 적용됩니다. 그러나 트랜잭션을 설정하고 이러한 호출의 일괄 처리를 실행할 수 있습니다. 업데이트는 커밋할 때까지 영구적이지 않습니다. 마음이 바뀌면 커밋하는 대신 트랜잭션을 롤백할 수 있습니다.
트랜잭션에 대한 자세한 내용은 트랜잭션(ODBC)을 참조하세요.
레코드 집합을 닫는 것이 업데이트 미치는 영향
트랜잭션이 진행 중인 레코드 집합 또는 연결된 CDatabase
개체를 닫는 경우(CDatabase::CommitTrans 또는 CDatabase::Rollback을 호출하지 않은 경우) 트랜잭션은 자동으로 롤백됩니다(데이터베이스 백 엔드가 Microsoft Jet 데이터베이스 엔진이 아닌 경우).
주의
Microsoft Jet 데이터베이스 엔진을 사용하는 경우 명시적 트랜잭션 내에서 레코드 집합을 닫아도 명시적 트랜잭션이 커밋되거나 롤백될 때까지 수정된 행이나 잠금이 해제되지 않습니다. 명시적 Jet 트랜잭션 내부 또는 외부에서 항상 레코드 집합을 열고 닫는 것이 좋습니다.
스크롤이 업데이트 미치는 영향
레코드 집합: 레코드 집합에서 스크롤(ODBC)하면 편집 버퍼가 각각의 새 현재 레코드로 채워집니다(이전 레코드는 먼저 저장되지 않음). 스크롤은 이전에 삭제된 레코드를 건너뜁니다. 호출CommitTrans
Update
하지 않고 또는 호출 후 Edit
AddNew
스크롤하는 경우 또는 Rollback
먼저 새 레코드가 편집 버퍼에 추가되므로 변경 내용이 손실됩니다(경고 없음). 편집 버퍼는 스크롤된 레코드로 채워지고 저장된 레코드는 해제되며 데이터 원본에서는 변경되지 않습니다. 이는 두 가지 모두 AddNew
에 Edit
적용됩니다.
사용자의 업데이트 및 다른 사용자의 업데이트
레코드 집합을 사용하여 데이터를 업데이트하는 경우 업데이트는 다른 사용자에게 영향을 줍니다. 마찬가지로 레코드 집합의 수명 동안 다른 사용자의 업데이트가 영향을 줍니다.
다중 사용자 환경에서 다른 사용자는 레코드 집합에서 선택한 것과 동일한 레코드 중 일부를 포함하는 레코드 집합을 열 수 있습니다. 레코드를 검색하기 전에 변경한 내용은 레코드 집합에 반영됩니다. 다이내셋은 스크롤할 때마다 레코드를 검색하기 때문에 다이나셋은 레코드로 스크롤할 때마다 변경 내용을 반영합니다. 스냅샷은 처음 스크롤할 때 레코드를 검색하므로 스냅샷 처음에 레코드로 스크롤하기 전에 발생하는 변경 내용만 반영합니다.
레코드 집합을 연 후 다른 사용자가 추가한 레코드는 다시 쿼리하지 않는 한 레코드 집합에 표시되지 않습니다. 레코드 집합이 다이나셋인 경우 영향을 받는 레코드로 스크롤할 때 다른 사용자가 기존 레코드를 편집하면 다이나셋에 표시됩니다. 레코드 집합이 스냅샷 경우 스냅샷 다시 쿼리할 때까지 편집 내용이 표시되지 않습니다. 스냅샷 다른 사용자가 추가하거나 삭제한 레코드 또는 다이너셋의 다른 사용자가 추가한 레코드를 보려면 CRecordset::Requery를 호출하여 레코드 집합을 다시 빌드합니다. (다른 사용자의 삭제는 다이나셋에 표시됩니다.) 추가한 레코드를 보려면 호출 Requery
할 수도 있지만 삭제를 볼 수는 없습니다.
팁
전체 스냅샷 한 번에 강제로 캐싱하려면 스냅샷 연 직후에 호출 MoveLast
합니다. 그런 다음 레코드 작업을 시작하기 위해 호출 MoveFirst
합니다. MoveLast
는 모든 레코드를 스크롤하는 것과 같지만 한 번에 모두 검색합니다. 그러나 성능이 저하될 수 있으며 일부 드라이버에는 필요하지 않을 수 있습니다.
업데이트가 다른 사용자에게 미치는 영향은 사용자에게 미치는 영향과 유사합니다.
업데이트 및 삭제에 대한 자세한 정보
이 섹션에서는 작업 Update
하는 데 도움이 되는 추가 정보를 제공합니다.Delete
성공 및 실패 업데이트
성공하면 Update
또는 Edit
모드가 AddNew
종료됩니다. 또는 Edit
모드를 AddNew
다시 시작하려면 호출 AddNew
하거나 Edit
.
Update
실패(FALSE를 반환하거나 예외를 throw)하면 마지막으로 호출한 함수에 따라 모드로 Edit
AddNew
기본. 그런 다음, 다음 중 하나를 수행할 수 있습니다.
필드 데이터 멤버를 수정하고 다시 시도합니다
Update
.필드 데이터 멤버를 Null로 다시 설정하고 필드 데이터 멤버의 값을 설정한 다음 다시 호출하려면 호출
AddNew
Update
합니다.Edit
호출하여 첫 번째 호출 전에 레코드 집합에 있던 값을 다시 로드AddNew
하거나Edit
필드 데이터 멤버의 값을 설정한 다음 다시 호출Update
합니다. 호출이 성공한Update
후(호출 후AddNew
제외) 필드 데이터 멤버는 새 값을 유지합니다.변경 내용을 플러시하고 적용된 모든 모드 또는 모드를 종료하는 호출
Move
(AFX_MOVE_REFRESH 또는Edit
0의 매개 변수 포함Move
AddNew
).
업데이트 및 삭제
이 섹션은 둘 다 Update
에 적용됩니다 Delete
.
또는 Update
Delete
작업에서 하나만 레코드를 업데이트해야 합니다. 해당 레코드는 레코드 집합 필드의 데이터 값에 해당하는 현재 레코드입니다. 어떤 이유로든 레코드가 영향을 받지 않거나 둘 이상의 레코드가 영향을 받는 경우 다음 RETCODE 값 중 하나를 포함하는 예외가 throw됩니다.
AFX_SQL_ERROR_NO_ROWS_AFFECTED
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED
이러한 예외가 throw되면 호출 AddNew
하거나 Delete
호출 Update
할 때 있었던 상태나 Edit
상태에 기본. 이러한 예외가 표시되는 가장 일반적인 시나리오는 다음과 같습니다. 다음을 볼 가능성이 가장 높습니다.
AFX_SQL_ERROR_NO_ROWS_AFFECTED 낙관적 잠금 모드를 사용하고 다른 사용자가 프레임워크가 업데이트 또는 삭제할 올바른 레코드를 식별하지 못하도록 레코드를 수정한 경우입니다.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED 업데이트하는 테이블에 기본 키 또는 고유 인덱스가 없고 레코드 집합에 테이블 행을 고유하게 식별하기에 충분한 열이 없는 경우입니다.
참고 항목
레코드 집합(ODBC)
레코드 집합: 레코드 집합의 레코드 선택 방법(ODBC)
RFX(레코드 필드 교환)
SQL
예외: 데이터베이스 예외