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) 和异常:数据库异常。
继承层次结构
CDBException
要求
标头:afxdb.h
CDBException::m_nRetCode
包含 ODBC 应用程序编程接口 (API) 函数返回的 RETCODE 类型的 ODBC 错误代码。
备注
此类型包括 ODBC 定义的 SQL 前缀代码和数据库类定义的 AFX_SQL 前缀代码。 对于 CDBException
,此成员将包含以下值之一:
AFX_SQL_ERROR_API_CONFORMANCE
CDatabase::OpenEx
或CDatabase::Open
调用的驱动程序不符合所需的 ODBC API 一致性级别 1 (SQL_OAC_LEVEL1)。AFX_SQL_ERROR_CONNECT_FAIL 与数据源的连接失败。 将 NULL
CDatabase
指针传递给记录集构造函数,随后尝试基于GetDefaultConnect
创建连接失败。AFX_SQL_ERROR_DATA_TRUNCATED 请求的数据量超过提供的存储空间。 有关为
CString
或CByteArray
数据类型增加提供的数据存储的信息,请参阅“宏和全局”下的 RFX_Text 和 RFX_Binary 的nMaxLength
参数。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::AddNew
或CRecordset::Edit
。AFX_SQL_ERROR_LOCK_MODE_NOT_SUPPORTED 由于 ODBC 驱动程序不支持锁定,因此无法完成锁定记录以进行更新的请求。
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED 你为没有唯一键的表调用
CRecordset::Update
或Delete
并更改了多条记录。AFX_SQL_ERROR_NO_CURRENT_RECORD 你尝试编辑或删除以前删除的记录。 删除后必须滚动到新的当前记录。
AFX_SQL_ERROR_NO_POSITIONED_UPDATES 由于 ODBC 驱动程序不支持定位更新,因此无法完成对动态集的请求。
AFX_SQL_ERROR_NO_ROWS_AFFECTED 你调用了
CRecordset::Update
或Delete
,但开始操作时,无法再找到该记录。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::OpenEx
或CDatabase::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 类