다음을 통해 공유


TN068: 7 Microsoft Access ODBC 드라이버를 사용 하 여 트랜잭션을 수행

[!참고]

온라인 설명서의을 처음 포함 되었습니다 때문 다음 기술 참고 업데이트 되지 않았습니다.따라서 일부 절차 및 항목 오래 되었거나 잘못 된 수 있습니다.최신 정보는 온라인 설명서 색인에서 관심 있는 주제에 대해 검색 하는 것이 좋습니다.

이 참고가 Microsoft Access 7.0 ODBC 드라이버는 Microsoft ODBC 데스크톱 드라이버 팩 버전 3.0에 포함 하 고 MFC ODBC 데이터베이스 클래스를 사용 하는 경우 트랜잭션을 수행 하는 방법을 설명 합니다.

개요

응용 프로그램 데이터베이스 트랜잭션을 수행 하는 경우 호출 하도록 주의 해야 CDatabase::BeginTransCRecordset::Open 응용 프로그램에서 올바른 순서로.Microsoft Access 7.0 드라이버는 Microsoft Jet 데이터베이스 엔진을 사용 하 고 응용 프로그램 열린 커서는 데이터베이스에 트랜잭션을 시작 했음을 Jet 필요 합니다.MFC ODBC 데이터베이스 클래스의 경우에 열기를 열린 커서를 전제로 CRecordset 개체입니다.

호출 하기 전에 레코드 집합을 열면 BeginTrans, 모든 오류 메시지를 볼 수 없습니다.그러나 모든 레코드 집합을 호출한 후 영구적으로 적용 됩니다. 사용자 응용 프로그램에서는 업데이트 CRecordset::Update, 및 업데이트를 호출 하 여 롤백되지 않습니다 롤백.이 문제를 방지 하려면 호출 해야 BeginTrans 첫 번째 및 다음 레코드 집합을 엽니다.

MFC 드라이버 기능을 커서 커밋 및 롤백 동작을 확인합니다.클래스 CDatabase 두 개의 멤버 함수를 제공 합니다. GetCursorCommitBehaviorGetCursorRollbackBehavior, 모든 트랜잭션을 열기에 미치는 영향을 확인 하려면 CRecordset 개체입니다.이러한 멤버 함수는 Microsoft Access 7.0 ODBC 드라이버에 대 한 반환 SQL_CB_CLOSE 커서를 보존할 액세스 드라이버를 지원 하지 않기 때문입니다.따라서 호출 해야 CRecordset::Requery 다음에 CommitTrans 또는 롤백 작업.

거래를 여러 차례 수행 해야 할 때 호출할 수 없습니다 Requery 의 첫 번째 트랜잭션 및 다음 시작 후.다음 호출 하기 전에 레코드 집합을 닫아야 합니다 BeginTrans Jet의 요구 사항을 충족 합니다.이 기술 노트가이 상황을 처리 하는 두 가지 방법을 설명 합니다.

  • 후 각 레코드 집합을 닫는 CommitTrans 또는 롤백 작업.

  • ODBC API 함수를 사용 하 여 SQLFreeStmt.

각 CommitTrans 또는 Rollback 작업이 후 레코드 집합 닫기

트랜잭션이 시작 하기 전에 recordset 개체가 닫혀 있는지 확인 하십시오.호출 BeginTrans, 레코드 집합의 호출 열기 멤버 함수입니다.레코드 집합을 호출한 후 즉시 닫습니다 CommitTrans 또는 롤백.Note 반복적으로 열고 레코드 집합 닫기 응용 프로그램의 성능이 저하 될 수 있습니다.

Sqlfreestmt를 사용합니다.

ODBC API 함수를 사용할 수도 있습니다 SQLFreeStmt 명시적으로 트랜잭션을 종료 후 커서를 닫습니다.다른 트랜잭션을 시작 하려면 호출 BeginTransCRecordset::Requery.호출할 때 SQLFreeStmt, 레코드 집합의 HSTMT를 첫 번째 매개 변수로 지정 해야 하 고 SQL_CLOSE 두 번째 매개 변수로.이 메서드는 모든 트랜잭션의 시작 레코드 집합을 열고 닫는 보다 빠르게입니다.다음 코드는이 기술을 구현 하는 방법을 보여 줍니다.

CMyDatabase db;
db.Open( "MYDATASOURCE" );
CMyRecordset rs( &db );

// start transaction 1 and 
// open the recordset
db.BeginTrans( );
rs.Open( );

// manipulate data

// end transaction 1
db.CommitTrans( );  // or Rollback( )

// close the cursor
::SQLFreeStmt( rs.m_hstmt, SQL_CLOSE );

// start transaction 2
db.BeginTrans( );

// now get the result set
rs.Requery( );

// manipulate data

// end transaction 2
db.CommitTrans( );

rs.Close( );
db.Close( );

새로운 함수를 작성 하는 것이이 기술을 구현 하는 또 다른 방법은 RequeryWithBeginTrans를 호출 하 여 커밋한 후 다음 트랜잭션을 시작 하는 또는 롤백 첫 번째.이러한 함수를 작성 하려면 다음 단계를 수행 합니다.

  1. 코드를 복사 합니다. >crecordset () 에서 새 함수입니다.

  2. 호출 바로 뒤에 다음 줄을 추가 합니다. SQLFreeStmt:

    m_pDatabase->BeginTrans( );

이제이 트랜잭션의 각 쌍 사이의이 함수를 호출할 수 있습니다.

// start transaction 1 and 
// open the recordset
db.BeginTrans( );
rs.Open( );

// manipulate data

// end transaction 1
db.CommitTrans( );  // or Rollback( )

// close the cursor, start new transaction,
// and get the result set
rs.RequeryWithBeginTrans( );

// manipulate data

// end transaction 2
db.CommitTrans( );  // or Rollback( )

[!참고]

레코드 집합 멤버 변수를 변경 하는 경우이 방법을 사용 하지 마십시오 m_strFilter 또는 m_strSort 간의 거래.이런 경우 recordset 후 각 닫아야 합니다 CommitTrans 또는 롤백 작업.

참고 항목

기타 리소스

번호 기술 정보

범주별 기술 노트