TN068: 7 Microsoft Access ODBC 드라이버와 함께 트랜잭션 수행

이 노트 때 Microsoft ODBC Desktop Driver Pack 버전 3.0에에서 포함 된 Microsoft Access 7.0 ODBC 드라이버 및 MFC ODBC 데이터베이스 클래스를 사용 하 여 트랜잭션을 수행 하는 방법을 설명 합니다.

개요

트랜잭션을 수행 하는 데이터베이스 응용 프로그램을 호출 하는 CDatabase::BeginTrans 및 CRecordset::Open 응용 프로그램에서 올바른 순서로 조심 해야 합니다. Microsoft Access 7.0 드라이버는 Microsoft Jet 데이터베이스 엔진을 사용 하 고 Jet 응용 프로그램 열린 커서 있는 모든 데이터베이스에 대해 트랜잭션을 시작 하지 필요 합니다. MFC ODBC 데이터베이스 클래스에 대 한 열린 커서 열려 있는 CRecordset 개체에 상당。

BeginTrans를 호출 하기 전에 recordset을 열면 오류 메시지가 나타나지 않을 수 있습니다. 그러나, 응용 프로그램은 CRecordset::Update를 호출한 후 영구적 레코드 집합 업데이트 및 업데이트가 되지 롤백됩니다 Rollback을 호출 하 여. 이 문제를 방지 하려면 먼저 BeginTrans 를 호출 해야 합니다 및 다음 레코드 집합을 엽니다.

MFC는 커서 커밋 및 롤백 동작에 대 한 드라이버 기능을 검사합니다. CDatabase 클래스 오픈 CRecordset 개체에 모든 거래의 효과 확인 하려면 GetCursorCommitBehavior 및 GetCursorRollbackBehavior, 두 개의 멤버 함수를 제공 합니다. Microsoft Access 7.0 ODBC 드라이버에 대 한 이러한 멤버 함수는 액세스 드라이버는 커서 보존을 지원 하지 않으므로 SQL_CB_CLOSE 를 반환 합니다. 따라서, CRecordset::Requery CommitTrans 또는 Rollback 작업을 호출 해야 합니다.

하나의 다른 여러 트랜잭션을 수행 해야 하는 경우 첫 번째 트랜잭션이 후 Requery 를 호출 하 고 중 하나를 시작 수 없습니다. Jet의 요구 사항을 충족 하기 위해 BeginTrans 를 다음 호출 하기 전에 레코드 집합을 닫아야 합니다. 이 기술 노트에서는이 상황을 처리 하는 두 가지 방법을 설명 합니다.:

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

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

Sqlfreestmt를 사용 하 여

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

 CMyDatabase db;
db입니다.열기 ("MYDATASOURCE");
CMyRecordset rs (amp; db);

/ / 트랜잭션 1을 시작 하 고 / / 레코드 집합을 엽니다
db입니다.BeginTrans ();
rs입니다.열기 ();

/ / 데이터 조작

/ / 끝 트랜잭션 1
db입니다.CommitTrans ();? / / 또는 롤백)

/ / 커서
:: SQLFreeStmt (rs.m_hstmt, SQL_CLOSE);

/ / 트랜잭션 2 시작
db입니다.BeginTrans ();

/ / 이제 결과 집합을 얻을
rs입니다.Requery ();

/ / 데이터 조작

/ / 끝 트랜잭션 2
db입니다.CommitTrans ();

rs입니다.Close ();
db입니다.Close)(&A)

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

  1. 새로운 함수 CRecordset::Requery () 에 대 한 코드를 복사。

  2. SQLFreeStmt을 호출한 후 즉시 다음 줄을 추가:
    m_pDatabase-gt;BeginTrans(& );

지금 거래의 각 쌍 사이이 함수를 호출할 수 있습니다.:

/ / 트랜잭션 1을 시작 하 고 / / 레코드 집합을 엽니다
db입니다.BeginTrans ();
rs입니다.열기 ();

/ / 데이터 조작

/ / 끝 트랜잭션 1
db입니다.CommitTrans (); nbsp; / / 또는 롤백)

/ / 커서 닫기, 새 트랜잭션을 시작
/ / 결과 집합을 얻을
rs입니다.RequeryWithBeginTrans ();

/ / 데이터 조작

/ / 끝 트랜잭션 2
db입니다.CommitTrans ();? / / 또는 롤백)(&N)

메모nbsp;??레코드 집합 멤버 변수 m_strFilter 또는 m_strSort 트랜잭션 간에 변경 해야 하는 경우에이 기법을 사용 하지 마십시오. 이 경우, 각 CommitTrans 또는 Rollback 작업 후 레코드 닫아야(&N)。

기술 노트 번호로 |nbsp; 카테고리별 기술 노트(&N)

Index