异常:数据库异常
本文演示如何处理数据库异常。大多数材料本文中应用您使用的是了开放式数据库连接 (odbc) 的 MFC 类或数据访问对象的 MFC 类一起使用 (DAO)。对一个或其他模型中的物质特定显式标记。主题包括:
对于异常处理的路由
数据库异常处理的示例
对于异常处理的路由
该方法相同的是否使用 DAO 或 ODBC 一起使用。
应始终编写异常处理程序来处理异常情况。
对捕获数据库异常的最佳 pragmatic 方法是测试您的异常方案的应用程序。确定可能为您的代码的操作发生的异常,并强制发生异常。然后检查跟踪输出发现引发异常,或检查在调试器中返回的错误信息。这将通知您后者返回您为异常方案会看到您使用的代码。
用于 ODBC 异常的错误代码
除了返回框架中定义的代码,所以窗体 AFX_SQL_ERROR_XXX的名称,某些 CDBExceptions 基于 ODBC 返回代码。此类异常的返回代码具有窗体 SQL_ERROR_XXX的名称。
返回代码 —结构定义和 ODBC 定义 —该数据库类可能返回。类下 CDBException的 m_nRetCode 数据成员。附加有关 MSDN Library 返回 ODBC 定义的代码可在 ODBC SDK programmer's reference。
用于 DAO 异常的错误代码
对于 DAO 异常,更多信息通常可用。通过所捕获的 CDaoException 对象的三个数据成员可以访问错误信息:
m_pErrorInfo 包含指向封装在错误对象的 DAO 的集合的错误信息与该数据库的 CDaoErrorInfo 对象。
m_nAfxDaoError 包含从 MFC DAO 类的一个扩展的错误代码。这些错误代码,但窗体 AFX_DAO_ERROR_XXX的名称,文档在 CDaoException的数据成员下。
m_scode 包含从 DAO 的 OLE SCODE ,如果适用)。但您很少需要此错误代码,。通常更多信息可在其他两个数据成员。有关更多参见数据成员有关 SCODE 值。
有关 DAO 错误、 DAO 错误对象类型和 DAO 错误集合的附加信息可以在类 CDaoException下。
数据库异常处理的示例
下面的示例尝试构造 CRecordset- 堆上派生的对象。 new 运算符,然后打开记录集 (对于 ODBC 数据源)。有关 DAO 类的类似示例,请参见 “DAO 异常示例”下面。
ODBC 异常示例
打开 成员函数可能会引发异常 (ODBC 类的类型 CDBException ),因此, 打开 调用与 try 的此代码括号块。后续 catch 块捕捉 CDBException。可以检查异常对象,调用 e,但是,在本例中它是已知的足够尝试创建记录集失败。catch 块显示消息框并通过删除记录集对象清理。
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 数据源,而具有多个错误,可以通过 DAO 的基于 CDaoException::GetErrorCount返回的错误数的错误集合循环。每次通过循环,请调用 CDaoException::GetErrorInfo 重新填充 m_pErrorInfo 数据成员。