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 的需求。 此技術注意事項說明處理這種情況的兩種方法:
在每個
CommitTrans
或Rollback
作業之後關閉記錄集。使用 ODBC API 函式
SQLFreeStmt
。
在每個 CommitTrans 或復原作業之後關閉 Recordset
開始交易之前,請確定 recordset 物件已關閉。 呼叫 BeginTrans
之後,請通話記錄集 Open
的成員函式。 在呼叫 CommitTrans
或 Rollback
之後立即關閉記錄集。 請注意,重複開啟和關閉記錄集可能會使應用程式的效能變慢。
使用 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
您可以在認可或復原第一個交易之後呼叫以啟動下一個交易。 若要撰寫這類函式,請執行下列步驟:
將 的程式碼
CRecordset::Requery( )
複製到新的函式。在 呼叫
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
關閉記錄集。