解析:怎样处理应用程序中的错误和消息
由 Microsoft® SQL Server™ 2000 或 RAISERROR 语句产生的错误不是结果集的一部分。错误通过独立于结果集处理的错误处理机制返回给应用程序。
每个数据库 API 都包括一些函数、接口、方法、对象或结构的集合,通过这些集合返回错误和消息。每个 API 函数或方法通常返回表示操作成功的状态代码。如果此状态不是成功状态,则应用程序可以调用错误函数、方法或对象来检索错误信息。
实际上 SQL Server 有两种返回错误信息的机制:
错误
◆严重度为 11 或高于 11 的 sysmessages 中的错误。
◆严重度为 11 或高于 11 的任意 RAISERROR 语句。
邮件
◆PRINT 语句的输出。
◆几个 DBCC 语句的输出。
◆严重度为 10 或低于 10 的 sysmessages 中的错误。
◆严重度为 10 或低于 10 的任意 RAISERROR 语句。
ODBC 的错误处理
ODBC 规范引入的错误模型一直是一般数据库 API 的错误模型的基础,如 ADO、OLE DB 和通过 ODBC 建立的 API (RDO、DAO 和 MFC 数据库类)。在 ODBC 模型中,错误具有以下属性:
◆SQLSTATE
SQLSTATE 是一个 5 个字符的错误代码,它最初是在 ODBC 规范中定义的。SQLSTATE 对所有 ODBC 驱动程序是通用的,并为应用程序提供了对不同数据库返回的所有不同的错误代码进行无需测试的基本错误处理编码的方法。ODBC SQLSTATE 与 SQL Server 错误信息的状态属性无关。
ODBC 2.x 返回一个 SQLSTATE 代码的集合,ODBC 3.x 返回与 X/Open 数据管理并列的一组 SQLSTATE 代码:结构化查询语言 (SQL),标准版本 2。因为所有 ODBC 驱动程序都返回相同的 SQLSTATE 代码集合,所以将错误处理基于 SQLSTATE 代码的应用程序更易于移植。
◆本机错误号
本机错误号是来自基础数据库的错误号。ODBC 应用程序将收到的 SQL Server 错误号作为本机错误号。
◆错误信息字符串
错误信息通过错误信息字符串参数返回。
当 ODBC 函数返回的状态不是 SQL_SUCCESS 时,应用程序可以调用 SQLGetDiagRec 以获得错误信息。例如,如果 ODBC 应用程序收到一个语法错误(SQL Server 错误 170),则 SQLGetDiagRec 返回:
szSqlState = 42000, pfNative = 170szErrorMsg ='[Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near * |
ODBC SQLGetDiagField 函数允许 ODBC 驱动程序在此驱动程序返回的诊断记录中指定驱动程序特定的诊断字段。SQL Server ODBC 驱动程序指定驱动程序特定的字段以放置 SQL Server 错误信息,如 SQL Server 严重度和状态代码。
ADO 的错误处理
ADO 使用 Errors 对象和 Errors 集合返回标准错误信息,如 SQLSTATE、本机错误号和错误信息字符串。这些信息与 ODBC 中的相同。ADO 不支持任何提供程序特定的错误接口,因此 SQL Server 特定的错误信息,如严重度或状态,也可用于 ADO 应用程序。
OLE DB 的错误处理
OLE DB 使用 IErrorInfo 接口返回标准错误信息,如 SQLSTATE、本机错误号和错误字符串。这些信息与 ODBC 中的相同。SQL Server 的 Microsoft OLE DB 提供程序定义了一个 ISQLServerErrorInfo 接口,用来返回 SQL Server 特定信息,如严重度、状态、过程名称和行号。
DB-Library 的错误处理
DB-Library 使用一种不同的机制将错误信息返回给应用程序。应用程序定义了两种回调函数——错误处理程序和消息处理程序。当 DB-Library 的动态链接库有错误或消息要返回时,它会调用应用程序的错误处理程序或消息处理程序函数。由于 DB-Library 为 SQL Server 所特有,所有的 SQL Server 错误信息在错误和消息处理程序中都是可用的。DB-Library 把 PRINT 消息和低严重度错误或 RAISERROR 消息返回给消息处理程序,而把高严重度错误和 RAISERROR 消息返回给错误处理程序函数。