分享方式:


TN068:使用 Microsoft Access 7 ODBC 驅動程式執行異動

注意

下列技術提示自其納入線上文件以來,未曾更新。 因此,有些程序和主題可能已過期或不正確。 如需最新資訊,建議您在線上文件索引中搜尋相關的主題。

此附注說明如何使用 MFC ODBC 資料庫類別和 Microsoft Access 7.0 ODBC 驅動程式隨附于 Microsoft ODBC Desktop Driver Pack 3.0 版時執行交易。

概觀

如果您的資料庫應用程式執行交易,您必須小心呼叫 CDatabase::BeginTrans CRecordset::Open 應用程式的正確順序。 Microsoft Access 7.0 驅動程式會使用 Microsoft Jet 資料庫引擎,Jet 會要求您的應用程式不會在任何具有開啟資料指標的資料庫上開始交易。 針對 MFC ODBC 資料庫類別,開啟的資料指標等於開啟 CRecordset 的物件。

如果您在呼叫 BeginTrans 之前開啟記錄集,則可能不會看到任何錯誤訊息。 不過,您的應用程式所做的任何記錄集更新會在呼叫 CRecordset::Update 之後變成永久,而且不會透過呼叫 Rollback 來回複更新。 若要避免這個問題,您必須先呼叫 BeginTrans ,然後開啟記錄集。

MFC 會檢查驅動程式功能,以取得資料指標認可和復原行為。 類別 CDatabase 提供兩個成員函式 和 GetCursorCommitBehavior GetCursorRollbackBehavior ,以判斷任何交易對開啟 CRecordset 物件的影響。 對於 Microsoft Access 7.0 ODBC 驅動程式,這些成員函式會傳回 SQL_CB_CLOSE ,因為 Access 驅動程式不支援資料指標保留。 因此,您必須在 或 Rollback 作業之後 CommitTrans 呼叫 CRecordset::Requery

當您需要一個接一個地執行多個交易時,您無法在第一個交易之後呼叫 Requery ,然後啟動下一個交易。 您必須在下一次呼叫 BeginTrans 之前關閉記錄集,才能滿足 Jet 的需求。 此技術注意事項說明處理這種情況的兩種方法:

  • 在每個 CommitTransRollback 作業之後關閉記錄集。

  • 使用 ODBC API 函式 SQLFreeStmt

在每個 CommitTrans 或復原作業之後關閉 Recordset

開始交易之前,請確定 recordset 物件已關閉。 呼叫 BeginTrans 之後,請通話記錄集 Open 的成員函式。 在呼叫 CommitTransRollback 之後立即關閉記錄集。 請注意,重複開啟和關閉記錄集可能會使應用程式的效能變慢。

使用 SQLFreeStmt

您也可以使用 ODBC API 函式 SQLFreeStmt ,在結束交易之後明確關閉資料指標。 若要啟動另一個交易,請呼叫 BeginTrans 後面接著 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_strFilter m_strSort ,請勿使用這項技術。 在此情況下,您應該在每個 或 Rollback 作業之後 CommitTrans 關閉記錄集。

另請參閱

依編號顯示的技術提示
依分類區分的技術提示