CDBException 类

表示由数据库类引起的异常条件。

语法

class CDBException : public CException

成员

公共数据成员

“属性” 描述
CDBException::m_nRetCode 包含 RETCODE 类型的开放式数据库连接 (ODBC) 返回代码。
CDBException::m_strError 包含以字母数字形式描述错误的字符串。
CDBException::m_strStateNativeOrigin 包含根据 ODBC 返回的错误代码描述错误的字符串。

注解

该类包括两个公共数据成员,可用于确定异常原因或显示描述异常的文本消息。 CDBException 对象由数据库类的成员函数构造和引出。

注意

此类是 MFC 的开放式数据库连接 (ODBC) 类之一。 如果改用较新的数据访问对象 (DAO) 类,请改用 CDaoException。 所有 DAO 类名都有“CDao”作为前缀。 有关详细信息,请参阅文章概述:数据库编程

异常是指异常执行的情况,包括程序无法控制的情况,如数据源或网络 I/O 错误。 在正常执行程序的过程中可能会发现,通常未将错误视为异常。

可以在 CATCH 表达式的范围内访问这些对象。 还可以使用 AfxThrowDBException 全局函数从自己的代码中引出 CDBException 对象。

有关常规异常处理或 CDBException 对象的详细信息,请参阅文章异常处理 (MFC) 异常:数据库异常

继承层次结构

CObject

CException

CDBException

要求

标头:afxdb.h

CDBException::m_nRetCode

包含 ODBC 应用程序编程接口 (API) 函数返回的 RETCODE 类型的 ODBC 错误代码。

备注

此类型包括 ODBC 定义的 SQL 前缀代码和数据库类定义的 AFX_SQL 前缀代码。 对于 CDBException,此成员将包含以下值之一:

  • AFX_SQL_ERROR_API_CONFORMANCE CDatabase::OpenExCDatabase::Open 调用的驱动程序不符合所需的 ODBC API 一致性级别 1 (SQL_OAC_LEVEL1)。

  • AFX_SQL_ERROR_CONNECT_FAIL 与数据源的连接失败。 将 NULL CDatabase 指针传递给记录集构造函数,随后尝试基于 GetDefaultConnect 创建连接失败。

  • AFX_SQL_ERROR_DATA_TRUNCATED 请求的数据量超过提供的存储空间。 有关为 CStringCByteArray 数据类型增加提供的数据存储的信息,请参阅“宏和全局”下的 RFX_TextRFX_BinarynMaxLength 参数。

  • AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED 调用请求动态集的 CRecordset::Open 失败。 驱动程序不支持动态集。

  • AFX_SQL_ERROR_EMPTY_COLUMN_LIST 尝试打开表(或者提供的内容无法标识为过程调用或 SELECT 语句),但在 DoFieldExchange 替代中的记录字段交换 (RFX) 函数调用中没有标识列

  • AFX_SQL_ERROR_FIELD_SCHEMA_MISMATCH DoFieldExchange 替代中的 RFX 函数类型不兼容记录集中的列数据类型。

  • AFX_SQL_ERROR_ILLEGAL_MODE 调用 CRecordset::Update 之前未调用 CRecordset::AddNewCRecordset::Edit

  • AFX_SQL_ERROR_LOCK_MODE_NOT_SUPPORTED 由于 ODBC 驱动程序不支持锁定,因此无法完成锁定记录以进行更新的请求。

  • AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED 你为没有唯一键的表调用 CRecordset::UpdateDelete 并更改了多条记录。

  • AFX_SQL_ERROR_NO_CURRENT_RECORD 你尝试编辑或删除以前删除的记录。 删除后必须滚动到新的当前记录。

  • AFX_SQL_ERROR_NO_POSITIONED_UPDATES 由于 ODBC 驱动程序不支持定位更新,因此无法完成对动态集的请求。

  • AFX_SQL_ERROR_NO_ROWS_AFFECTED 你调用了 CRecordset::UpdateDelete,但开始操作时,无法再找到该记录。

  • AFX_SQL_ERROR_ODBC_LOAD_FAILED 尝试加载 ODBC.DLL 失败;Windows 找不到或无法加载此 DLL。 此错误非常严重。

  • AFX_SQL_ERROR_ODBC_V2_REQUIRED 由于需要符合级别 2 的 ODBC 驱动程序,因此无法完成对动态集的请求。

  • AFX_SQL_ERROR_RECORDSET_FORWARD_ONLY 尝试滚动失败,因为数据源不支持向后滚动。

  • AFX_SQL_ERROR_SNAPSHOT_NOT_SUPPORTED 调用 CRecordset::Open 请求快照失败。 驱动程序不支持快照。 (只有 ODBC 游标库 ODBCCURS.DLL 不存在时才会出现这种情况。)

  • AFX_SQL_ERROR_SQL_CONFORMANCE CDatabase::OpenExCDatabase::Open 调用的驱动程序不符合所需的“最低”ODBC SQL 一致性级别 (SQL_OSC_MINIMUM)。

  • AFX_SQL_ERROR_SQL_NO_TOTAL ODBC 驱动程序无法指定 CLongBinary 数据值的总大小。 该操作可能失败,因为无法预分配全局内存块。

  • AFX_SQL_ERROR_RECORDSET_READONLY 你尝试更新只读记录集,或者数据源为只读。 无法对记录集或与之关联的 CDatabase 对象执行任何更新操作。

  • SQL_ERROR 函数失败。 ODBC 函数 SQLError 返回的错误消息存储在 m_strError 数据成员中。

  • SQL_INVALID_HANDLE 由于环境句柄、连接句柄或语句句柄无效,函数失败。 这表示编程错误。 ODBC 函数 SQLError 中无其他可用信息。

SQL 前缀代码由 ODBC 定义。 AFX 前缀代码在 AFXDB.H 中定义,位于 MFC\INCLUDE 中。

CDBException::m_strError

包含描述导致异常的错误的字符串。

注解

该字符串以字母数字术语描述错误。 有关详细信息及示例,请参阅 m_strStateNativeOrigin

CDBException::m_strStateNativeOrigin

包含描述导致异常的错误的字符串。

备注

该字符串的格式为“State:%s,Native:%ld,Origin:%s”,其中格式代码按顺序替换为描述以下内容的值:

  • SQLSTATE,以 null 结尾的字符串,其中包含在 ODBC 函数 SQLError 的 szSqlState 参数中返回的五个字符的错误代码。 SQLSTATE 值在 ODBC 程序员参考的附录 A,ODBC 错误代码中列出。 示例:“S0022”。

  • 特定于数据源的本机错误代码,在 SQLError 函数的 pfNativeError 参数中返回。 示例:207。

  • SQLError 函数的 szErrorMsg 参数中返回的错误消息文本。 此消息由几个带括号的名称组成。 错误从源传递给用户时,每个 ODBC 组件(数据源、驱动程序、驱动程序管理器)都会附加自己的名称。 此信息有助于查明错误的来源。 示例:[Microsoft][ODBC SQL Server Driver][SQL Server]

框架解释错误字符串并将其组件放入 m_strStateNativeOrigin;如果 m_strStateNativeOrigin 包含多个错误的信息,则错误将由换行符分隔。 框架将字母数字错误文本放入 m_strError

有关用于构成此字符串的代码的其他信息,请参阅 ODBC 程序员参考中的 SQLError 函数。

示例

来自 ODBC:“State:S0022,Native:207,Origin:[Microsoft][ODBC SQL Server Driver][SQL Server] Invalid column name 'ColName'”

m_strStateNativeOrigin 中:“State:S0022,Native:207,Origin:[Microsoft][ODBC SQL Server Driver][SQL Server]”

m_strError 中:“Invalid column name 'ColName'”

另请参阅

CException 类
层次结构图
CDatabase 类
CRecordset 类
CFieldExchange 类
CRecordset::Update
CRecordset::Delete
CException 类