共用方式為


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

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

例外狀況處理的方法

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

您應該一律撰寫例外狀況處理常式來處理例外狀況。

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

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

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

傳回碼 -- 架構定義和 ODBC 定義 - 資料庫類別可以傳回的檔會記錄在 類別 CDBException 的 m_nRetCode 資料成員之下。 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 類別 下取得。

資料庫例外狀況處理範例

下列範例會嘗試使用 new 運算子在堆積上建構 CRecordset 衍生的物件,然後開啟記錄集 (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 傳回之錯誤資訊的討論,請參閱 CDaoException CDaoErrorInfo 類別 。

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

另請參閱

例外狀況處理