共用方式為


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

本文說明如何處理資料庫例外狀況。 本文中的大部分內容都適用於您使用 Open Database Connectivity (ODBC) 的 MFC 類別或數據存取物件的 MFC 類別 (DAO)。 一個或另一個模型特有的資料都會被明確標示。 主題包括:

例外狀況處理的方法

不論您是使用 DAO(已過時)還是 ODBC,此方法都相同。

您應該一律撰寫例外狀況處理程序來處理例外狀況。

擷取資料庫例外狀況最務實的方法,就是使用例外狀況來測試您的應用程式。 判斷程式代碼中作業可能發生的可能例外狀況,並強制發生例外狀況。 然後檢查追蹤輸出以查看擲回的例外狀況,或檢查調試程式中傳回的錯誤資訊。 這可讓您知道您會在所使用的例外狀況案例中看到哪些傳回碼。

ODBC 例外狀況所使用的錯誤碼

除了架構所定義的傳回碼,這些傳回碼具有形式 AFX_SQL_ERROR_XXX 的名稱之外,有些 CDBExceptions 是以 ODBC 傳回碼為基礎。 這類例外狀況的傳回碼具有名稱格式為 SQL_ERROR_XXX

無論是架構定義或是 ODBC 定義的傳回碼,是資料庫類別可以傳回的,記錄在類別 CDBException 資料成員下。 ODBC 程式設計人員參考中提供 ODBC 所定義之傳回碼的其他資訊。

DAO 例外狀況所使用的錯誤碼

針對 DAO 例外狀況,通常會提供更多資訊。 您可以透過捕獲到的 CDaoException 物件的三個數據成員來存取錯誤資訊:

  • m_pErrorInfo 包含 CDaoErrorInfo 物件的指標,該物件會將錯誤資訊封裝在 DAO 與資料庫相關聯的錯誤物件集合中。

  • m_nAfxDaoError 包含 MFC DAO 類別的擴充錯誤碼。 這些錯誤碼,其名稱格式為AFX_DAO_ERROR_XXX,記錄在 CDaoException 中的數據成員下。

  • m_scode 包含來自 DAO 的 OLE SCODE,如果適用。 不過,您很少需要使用這個錯誤碼。 其他兩個數據成員通常會提供更多資訊。 如需 SCODE 值的詳細資訊,請參閱數據成員。

DAO 錯誤、DAO Error 物件類型和 DAO Errors 集合的其他資訊可在 CDaoException 類別下取得。

資料庫 Exception-Handling 範例

下列範例會嘗試使用 運算符在堆積上建構 new 衍生的物件,然後開啟記錄集 (ODBC 數據源)。 如需 DAO 類別的類似範例,請參閱下方的

ODBC 例外狀況範例

Open 成員函式可能會擲回例外狀況(ODBC 類別的 CDBException 類型),因此此程式碼會Opentry區塊括住呼叫。 後續 catch 區塊會攔截 CDBException。 您可以檢查稱為 e 的例外狀況物件本身,但在此情況下,知道嘗試建立記錄集失敗就已經足夠。 區塊 catch 會顯示消息框,並藉由刪除 recordset 物件來清除。

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;
}

DAO 例外狀況範例

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 類別。

當您使用 Microsoft Jet (.mdb) 資料庫,而且在大部分情況下,當您使用 ODBC 時,只會有一個錯誤物件。 在少數情況下,當您使用 ODBC 數據源且發生多個錯誤時,您可以根據 CDaoException::GetErrorCount 所傳回的錯誤數目,迴圈查看 DAO 的 Errors 集合。 每次透過迴圈時,呼叫 CDaoException::GetErrorInfo 以重新填入 m_pErrorInfo 數據成員。

另請參閱

例外狀況處理