本文說明如何處理資料庫例外狀況。 本文中的大部分內容都適用於您使用 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 類型),因此此程式碼會Open以try區塊括住呼叫。 後續 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 數據成員。