异常:数据库异常
本文演示如何处理数据库异常。 大多数材料本文中应用您使用的是了开放式数据库连接 (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 数据成员。