共用方式為


例外狀況: 資料庫例外狀況

這篇文章說明如何處理資料庫例外狀況。 無論您是使用 MFC 類別的開放式資料庫連接 (ODBC) 或 MFC 類別資料存取物件 (DAO),適用於這份文件中的大部分。 只適用於下列一或其他模型被明確地標示。 主題包括:

  • 例外處理的方法

  • 資料庫例外處理範例

例外處理的方法

無論您是使用 DAO 或 ODBC 方法都是一樣的。

您應該總是寫入例外處理常式來處理例外的條件。

若要測試您的應用程式與例外狀況會捕捉資料庫例外狀況最實用的方法。 決定可能的例外狀況可能會發生在您的程式碼中的作業,並強制發生的例外狀況。 然後檢查追蹤輸出,以查看哪些例外狀況時,或檢查在偵錯工具中傳回的錯誤資訊。 這可讓您知道的任何傳回的碼就會出現您所使用的例外狀況。

19b8k939.collapse_all(zh-tw,VS.110).gif用於 ODBC 的例外狀況的錯誤碼

除了架構所定義的傳回碼,其中會有形式的名稱 AFX_SQL_ERROR_XXX,有些 CDBExceptions 根據 ODBC 傳回碼。 對於這類例外狀況的傳回碼有形式的名稱 SQL_ERROR_XXX

傳回碼 — 同時架構定義和 ODBC 定義 — 資料庫類別會傳回所記載下 m_nRetCode 類別的資料成員CDBException。 定義由 ODBC 傳回碼的其他資訊適用於 ODBC SDK 程式設計人員參考 》 MSDN Library 中。

19b8k939.collapse_all(zh-tw,VS.110).gif使用對於 DAO 例外狀況的錯誤碼

對於 DAO 例外狀況,是都可以使用更多的資訊。 您可以透過已攔截的三個資料成員來存取資訊時發生錯誤 CDaoException 物件:

  • m_pErrorInfo 包含變數的指標, CDaoErrorInfo 物件,它可封裝與資料庫相關的 error 物件的 DAO 的集合中的資訊時發生錯誤。

  • m_nAfxDaoError 包含延伸的錯誤代碼從 MFC DAO 類別。 這些錯誤碼具有形式的名稱 AFX_DAO_ERROR_XXX,會記錄內的資料成員下CDaoException

  • m_scode 包含 OLE SCODE的如果有的話。 您必須很少使用這個錯誤碼,不過。 通常更多的資訊適用於其他兩個資料成員。 如需詳細資訊的資料成員,請參閱SCODE的值。

在 [類別] 下的 DAO 錯誤、 DAO 錯誤的物件型別和 DAO Errors 集合的其他資訊位於 CDaoException

資料庫例外處理範例

下列範例會嘗試建構 CRecordset-衍生物件在堆積的 運算子,然後開啟資料錄集 (適用於 ODBC 資料來源)。 如需 DAO 類別類似的範例,請參閱以下的"DAO 例外狀況範例 」。

19b8k939.collapse_all(zh-tw,VS.110).gifODBC 例外狀況範例

開啟 成員函式可能會擲回例外狀況 (型別的 CDBException ODBC 類別),所以這個括號括住的程式碼開啟 以呼叫 區塊。 後續攔截區塊會攔截CDBException。 您可以檢查例外物件本身,呼叫e,但在此情況下便能夠知道建立資料錄集的嘗試已經失敗。 攔截區塊會顯示訊息方塊,並藉由刪除資料錄集物件會清除。

CRecordset* CMyDatabaseDoc::GetRecordset()
{
   CCourses* pSet = new CCourses(&m_dbCust);
   try
   {
      pSet->Open();
   }
   catch(CDBException* e)
   {
      AfxMessageBox(e->m_strError, MB_ICONEXCLAMATION);
      // Delete the incomplete recordset object
      delete pSet;
      pSet = NULL;
      e->Delete();
   }
   return pSet;
}

19b8k939.collapse_all(zh-tw,VS.110).gifDAO 例外狀況範例

DAO 範例類似於 odbc,但您通常可以擷取更多的資訊。 下列程式碼也會嘗試開啟資料錄集。 如果那嘗試擲回例外狀況,您可以檢查錯誤資訊的例外狀況物件的資料成員。 因為您之前的 ODBC 範例中,很可能不足,無法知道建立資料錄集的嘗試失敗。

CDaoRecordset* CMyDaoDatabaseDoc::GetRecordset()
{
   CDaoRecordset* pSet = new CCustSet(&m_db);
   try
   {
      pSet->Open();
   }
   catch(CDaoException* pe)
   {
      AfxMessageBox(pe->m_pErrorInfo->m_strDescription, MB_ICONEXCLAMATION);
      // Delete the incomplete recordset object
      delete pSet;
      pSet = NULL;
      pe->Delete();
   }
   return pSet;
}

這段程式碼取得錯誤訊息字串來自 m_pErrorInfo 的例外狀況物件的成員。 就會擲回例外狀況時,MFC 將填滿這個成員。

如需錯誤的資訊傳回的CDaoException物件,請參閱類別 CDaoExceptionCDaoErrorInfo

當您正在使用 ODBC,使用 Microsoft Jet (.mdb) 資料庫,而且在大多數情況下,會只有一個物件時發生錯誤。 在極少數的案例時您正在使用 ODBC 資料來源,而且有多個錯誤,您可以逐一 DAO 的錯誤集合為基礎所傳回的錯誤數目 CDaoException::GetErrorCount。 每次迴圈後呼叫 CDaoException::GetErrorInfo 以重新填滿m_pErrorInfo資料成員。

請參閱

概念

在 MFC 中處理的例外狀況