异常:数据库异常

本文演示如何处理数据库异常。 大多数材料本文中应用您使用的是了开放式数据库连接 (odbc) 的 MFC 类或数据访问对象的 MFC 类一起使用 (DAO)。 对一个或其他模型中的物质特定显式标记。 主题包括:

  • 对于异常处理的路由

  • 数据库异常处理的示例

对于异常处理的路由

该方法相同的是否使用 DAO 或 ODBC 一起使用。

应始终编写异常处理程序来处理异常情况。

对捕获数据库异常的最佳 pragmatic 方法是测试您的异常方案的应用程序。 确定可能为您的代码的操作发生的异常,并强制发生异常。 然后检查跟踪输出发现引发异常,或检查在调试器中返回的错误信息。 这将通知您后者返回您为异常方案会看到您使用的代码。

19b8k939.collapse_all(zh-cn,VS.110).gif用于 ODBC 异常的错误代码

除了返回框架中定义的代码,所以窗体 AFX_SQL_ERROR_XXX的名称,某些 CDBExceptions 基于 ODBC 返回代码。 此类异常的返回代码具有窗体 SQL_ERROR_XXX的名称。

返回代码 —结构定义和 ODBC 定义 —该数据库类可能返回。类下 CDBExceptionm_nRetCode 数据成员。 附加有关 MSDN Library 返回 ODBC 定义的代码可在 ODBC SDK programmer's reference。

19b8k939.collapse_all(zh-cn,VS.110).gif用于 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 异常示例”下面。

19b8k939.collapse_all(zh-cn,VS.110).gifODBC 异常示例

打开 成员函数可能会引发异常 (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;
}

19b8k939.collapse_all(zh-cn,VS.110).gifDAO 异常示例

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 数据源,而具有多个错误,可以通过 DAO 的基于 CDaoException::GetErrorCount返回的错误数的错误集合循环。 每次通过循环,请调用 CDaoException::GetErrorInfo 重新填充 m_pErrorInfo 数据成员。

请参见

概念

异常处理在MFC