TN068: 執行在 Microsoft Access 7 ODBC 驅動程式的交易
注意事項 |
---|
由於它第一次線上文件中包含尚未更新下列技術提示。如此一來,某些程序和主題可能已經過期或不正確。如需最新資訊,建議您先搜尋線上文件索引中有興趣的主題。 |
這個註解告訴您,如何使用 MFC ODBC 資料庫類別,並包含在 Microsoft ODBC 桌面驅動程式套件版本 3.0 的 Microsoft Access 7.0 ODBC 驅動程式時,執行異動。
概觀
如果您的資料庫應用程式執行的交易,您必須小心呼叫CDatabase::BeginTrans和CRecordset::Open應用程式中正確的順序。 Microsoft Access 7.0 驅動程式會使用 Microsoft Jet 資料庫引擎,而且 Jet 需要您的應用程式不是在已開啟的游標的任何資料庫的交易。 MFC ODBC 資料庫類別,開啟的游標相當於已開啟的CRecordset物件。
如果您開啟資料錄集呼叫之前集指令,您可能無法看見任何錯誤訊息。 然而,任何資料錄集更新不會出現在撥號後在您的應用程式會讓CRecordset::Update,而且更新將不會回復藉由呼叫復原。 若要避免這個問題,您必須呼叫集指令第一,然後開啟資料錄集。
MFC 會檢查資料指標的認可和復原行為的驅動程式功能。 類別CDatabase提供兩個成員函式, GetCursorCommitBehavior和GetCursorRollbackBehavior,以判斷在您開啟任何交易的效果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,都可以啟動下一個交易認可後進行呼叫,或復原第一個。 若要撰寫這類函式,執行下列步驟:
將複製的程式碼 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之間的交易。在此情況下,請先關閉資料錄集之後為每個, 版本 或 復原作業。 |