다음을 통해 공유


레코드 집합: AddNew, Edit 및 Delete의 작동 방식(ODBC)

이 항목은 MFC ODBC 클래스에 적용됩니다.

이 항목에서는 클래스 CRecordsetAddNew, EditDelete 멤버 함수가 작동하는 방법을 설명합니다. 다음 내용을 다룹니다.

참고 항목

이 토픽은 대량 행 페치가 구현되지 않은 CRecordset에서 파생된 개체에 적용됩니다. 대량 행 가져오기를 사용하는 경우 레코드 집합: 대량으로 레코드 가져오기(ODBC)를 참조하세요.

추가 기능으로, 업데이트 작업에서 RFX의 해당 역할을 설명하는 레코드 필드 교환: RFX 작동 방식을 읽을 수 있습니다.

레코드 추가

레코드 집합에 새 레코드를 추가하려면 레코드 집합의 AddNew 멤버 함수를 호출하고, 새 레코드의 필드 데이터 멤버 값을 설정하고, Update 멤버 함수를 호출하여 레코드를 데이터 원본에 씁니다.

호출 AddNew의 전제 조건으로 레코드 집합을 읽기 전용으로 열지 않아야 합니다. CanUpdateCanAppend 멤버 함수를 사용하면 이러한 조건을 확인할 수 있습니다.

호출 AddNew할 때:

  • 편집 버퍼의 레코드가 저장되므로 작업이 취소되면 해당 내용을 복원할 수 있습니다.

  • 필드 데이터 멤버는 플래그가 지정되므로 나중에 변경 내용을 검색할 수 있습니다. 필드 데이터 멤버도 정리(변경되지 않음)로 표시되고 Null로 설정됩니다.

호출 AddNew후 편집 버퍼는 값으로 채울 준비가 된 비어 있는 새 레코드를 나타냅니다. 이렇게 하려면 값을 할당하여 수동으로 설정합니다. 필드에 대한 실제 데이터 값을 지정하는 대신 Null 값을 지정하도록 호출 SetFieldNull 할 수 있습니다.

변경 내용을 커밋하려면 .를 호출 Update합니다. 새 레코드를 호출 Update 하는 경우:

  • ODBC 드라이버가 ::SQLSetPos ODBC API 함수를 지원하는 경우 MFC는 이 함수를 사용하여 데이터 원본에 레코드를 추가합니다. 이 ::SQLSetPos경우 MFC는 SQL 문을 생성하고 처리할 필요가 없으므로 레코드를 더 효율적으로 추가할 수 있습니다.

  • 사용할 수 없는 경우 ::SQLSetPos MFC는 다음을 수행합니다.

    1. 변경 내용이 검색되지 Update 않으면 아무 것도 수행하지 않고 0을 반환합니다.

    2. 변경 Update 내용이 있는 경우 SQL INSERT 문을 생성합니다. 모든 더티 필드 데이터 멤버가 나타내는 열이 INSERT 문에 나열됩니다. 열을 강제로 포함하려면 SetFieldDirty 멤버 함수를 호출합니다.

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. Update 는 새 레코드 를 커밋합니다. 트랜잭션이 진행되지 않는 한 INSERT 문이 실행되고 레코드가 데이터 원본의 테이블에 커밋됩니다(스냅샷이 아닌 경우 레코드 집합).

    4. 저장된 레코드가 편집 버퍼로 복원됩니다. 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을 위한 전제 조건으로 레코드 집합을 업다이블하고 레코드에 저장해야 합니다. CanUpdateIsDeleted 멤버 함수를 사용하면 이러한 조건을 확인할 수 있습니다. 현재 레코드도 아직 삭제되지 않았어야 하며 레코드 집합에 레코드가 있어야 합니다(둘 다 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는 다음을 수행합니다.

    1. 변경 Update 내용이 없으면 아무 것도 수행하지 않고 0을 반환합니다.

    2. 변경 Update 내용이 있는 경우 SQL UPDATE 문을 생성합니다. UPDATE 문에 나열된 열은 변경된 필드 데이터 멤버를 기반으로 합니다.

    3. Update 변경 내용을 커밋합니다. UPDATE 문을 실행하면 데이터 원본에서 레코드가 변경되지만 트랜잭션이 진행 중인 경우 커밋되지 않습니다(트랜잭션: 트랜잭션이 업데이트에 미치는 영향에 대한 자세한 내용은 ODBC(Recordset) 에서 트랜잭션 수행 참조). ODBC는 레코드의 복사본을 유지하며 이는 변경도 합니다.

    4. 프로세스 AddNew와 달리 프로세스는 Edit 저장된 레코드를 복원하지 않습니다. 편집된 레코드는 현재 레코드로 유지됩니다.

    주의

    레코드 집합을 호출 Update하여 업데이트할 준비가 되면 레코드 집합에 테이블의 기본 키를 구성하는 모든 열(또는 테이블에 있는 고유 인덱스의 모든 열 또는 행을 고유하게 식별할 수 있는 충분한 열)이 포함됩니다. 경우에 따라 프레임워크는 레코드 집합에서 선택한 열만 사용하여 업데이트할 테이블의 레코드를 식별할 수 있습니다. 필요한 모든 열이 없으면 테이블에서 여러 레코드가 업데이트될 수 있습니다. 이 경우 호출할 때 Update프레임워크에서 예외를 throw합니다.

    이전에 함수를 호출 AddNewEdit 후 호출한 후 호출 Update하기 전에 편집 버퍼가 저장된 레코드로 새로 고쳐진 경우 진행 중인 새 레코드나 편집된 레코드를 대체합니다. 이 동작은 진행 중인 레코드에 오류가 있다고 판단되면 단순히 호출하거나 AddNew 다시 호출 Edit 하여 중단 AddNew 하거나 Edit 새 동작을 시작하는 방법을 제공합니다.

레코드 삭제

레코드 집합에서 레코드를 삭제하려면 레코드로 스크롤하고 레코드 집합의 Delete 멤버 함수를 호출해야 합니다. 와 달리 AddNew , Delete 에 대한 일치 호출UpdateEdit이 필요하지 않습니다.

호출 Delete의 전제 조건으로 레코드 집합을 업다이블해야 하며 레코드에 있어야 합니다. CanUpdate, IsBOF, IsEOFIsDeleted 멤버 함수를 사용하면 이러한 조건을 확인할 수 있습니다.

호출 Delete할 때:

  • ODBC 드라이버가 ::SQLSetPos ODBC API 함수를 지원하는 경우 MFC는 이 함수를 사용하여 데이터 원본의 레코드를 삭제합니다. 사용 ::SQLSetPos 은 일반적으로 SQL을 사용하는 것보다 더 효율적입니다.

    - 또는 -

  • 사용할 수 없는 경우 ::SQLSetPos MFC는 다음을 수행합니다.

    1. 편집 버퍼의 현재 레코드는 다음과 같이 AddNew Edit백업되지 않습니다.

    2. Delete 는 레코드를 제거하는 SQL DELETE 문을 생성합니다.

      편집 버퍼의 현재 레코드는 다음과 같이 AddNew Edit저장되지 않습니다.

    3. Delete는 삭제를 커밋합니다. DELETE 문을 실행합니다. 레코드는 데이터 원본에서 삭제된 것으로 표시되고 레코드가 스냅샷인 경우 ODBC에서 표시됩니다.

    4. 삭제된 레코드의 값은 여전히 레코드 집합의 필드 데이터 멤버에 있지만 필드 데이터 멤버는 Null로 표시되고 레코드 집합의 IsDeleted 멤버 함수는 0이 아닌 값을 반환합니다.

    참고 항목

    레코드를 삭제한 후 다른 레코드로 스크롤하여 편집 버퍼를 새 레코드의 데이터로 다시 채워야 합니다. 다시 호출하거나 호출 Delete Edit하는 것은 오류입니다.

업데이트 작업에 사용되는 SQL 문에 대한 자세한 내용은 SQL을 참조하세요.

참고 항목

레코드 집합(ODBC)
레코드 집합: 업데이트에 대한 추가 정보(ODBC)
RFX(레코드 필드 교환)