共用方式為


TN068: 執行在 Microsoft Access 7 ODBC 驅動程式的交易

注意事項注意事項

由於它第一次線上文件中包含尚未更新下列技術提示。如此一來,某些程序和主題可能已經過期或不正確。如需最新資訊,建議您先搜尋線上文件索引中有興趣的主題。

這個註解告訴您,如何使用 MFC ODBC 資料庫類別,並包含在 Microsoft ODBC 桌面驅動程式套件版本 3.0 的 Microsoft Access 7.0 ODBC 驅動程式時,執行異動。

概觀

如果您的資料庫應用程式執行的交易,您必須小心呼叫CDatabase::BeginTransCRecordset::Open應用程式中正確的順序。 Microsoft Access 7.0 驅動程式會使用 Microsoft Jet 資料庫引擎,而且 Jet 需要您的應用程式不是在已開啟的游標的任何資料庫的交易。 MFC ODBC 資料庫類別,開啟的游標相當於已開啟的CRecordset物件。

如果您開啟資料錄集呼叫之前集指令,您可能無法看見任何錯誤訊息。 然而,任何資料錄集更新不會出現在撥號後在您的應用程式會讓CRecordset::Update,而且更新將不會回復藉由呼叫復原。 若要避免這個問題,您必須呼叫集指令第一,然後開啟資料錄集。

MFC 會檢查資料指標的認可和復原行為的驅動程式功能。 類別CDatabase提供兩個成員函式, GetCursorCommitBehaviorGetCursorRollbackBehavior,以判斷在您開啟任何交易的效果CRecordset物件。 Microsoft Access 7.0 ODBC 驅動程式時,這些成員函式會傳回SQL_CB_CLOSE因為存取驅動程式不支援資料指標保留。 因此,您必須呼叫CRecordset::Requery版本復原作業。

當您需要執行多個交易,一個接一個時,您不能呼叫重新查詢後再開始下一個與第一筆交易。 您必須先關閉資料錄集到的下一通電話之前集指令 ,以滿足 Jet 的需求。 這份技術提示會說明兩種方法可以處理這種情況:

  • 關閉資料錄之後為每個, 版本復原作業。

  • 使用 ODBC API 函式 SQLFreeStmt

每個版本或復原作業之後,關閉資料錄

在開始之前的交易,請確定已關閉資料錄集物件。 在撥號後集指令,呼叫資料錄集的 開啟成員函式。 在撥號後立即關閉資料錄集版本復原。 請注意重複開啟和關閉資料錄集可以減慢應用程式的效能。

使用 SQLFreeStmt

您也可以使用 ODBC API 函式 SQLFreeStmt 明確的資料指標關閉後結束交易。 若要開始另一筆交易,呼叫集指令後面加上CRecordset::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::Requery () 到新的函式。

  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_strFilterm_strSort之間的交易。在此情況下,請先關閉資料錄集之後為每個, 版本復原作業。

請參閱

其他資源

技術的備忘稿編號

依類別的技術注意事項