处理应用程序中的错误和消息

由SQL Server 数据库引擎或 RAISERROR 语句产生的错误不是结果集的一部分。错误通过独立于结果集处理的错误处理机制返回给应用程序。

每个数据库应用程序编程接口 (API) 都包括一组函数、接口、方法、对象或结构,通过它们返回错误和消息。每个 API 函数或方法通常返回表示操作成功的状态代码。如果状态不是成功,应用程序可以调用错误函数、方法或对象来检索错误信息。

数据库引擎可以通过下列两种方法将信息返回调用方:

  1. 错误

    • 严重度为 11 或高于 11 的 sys.messages 中的错误。

    • 严重度为 11 或高于 11 的任意 RAISERROR 语句。

  2. 消息

    • PRINT 语句的输出。

    • 几个 DBCC 语句的输出。

    • 严重度为 10 或低于 10 的 sys.messages 中的错误。

    • 严重度为 10 或低于 10 的任意 RAISERROR 语句。

使用 ActiveX 数据对象 (ADO) 和 OLE DB 等 API 的应用程序通常不区分错误和消息。在开放式数据库连接 (ODBC) 应用程序中,消息生成 SQL_SUCCESS_WITH_INFO 函数返回代码,而错误通常生成 SQL_ERROR 返回代码。两者的差别在 DB-Library 中最为明显,其中错误返回给应用程序的是错误处理程序函数,而消息返回给应用程序的则是消息处理程序函数。同样,使用 SqlClient 提供程序时,错误将导致引发 SqlException 异常;消息不会改变控制流,而且可由应用程序代码通过注册 InfoMessage 事件处理程序的回调来截获。

其他组件也可能引起错误:

  • SQL Server 提供程序和 SQL Server ODBC 驱动程序的 OLE DB 会引起它们自己的错误。这些错误的格式与 API 规范中定义的格式是一致的。

  • Net-Library 会引起它们自己的错误。

  • 扩展存储过程 API 会引起其自身格式的错误。

  • SQL Server 向导、应用程序和实用工具(如 SQL Server Management Studio 和 sqlcmd 实用工具)可以引发它们自己的错误。

这些组件产生的错误返回调用应用程序时使用的基本机制与返回数据库引擎错误的基本机制相同。应用程序可以使用处理数据库引擎错误时使用的相同错误处理逻辑来处理这些错误。因为这些错误是在数据库引擎外引起的,所以无法在 Transact-SQL TRY...CATCH 结构中处理它们。有关详细信息,请参阅 TRY...CATCH (Transact-SQL)

ODBC 错误处理

ODBC 规范中介绍的错误模型一直作为一般数据库 API 的错误模型的基础,这些数据库 API 的示例包括 ADO、OLE DB 和通过 ODBC 建立的 API(RDO、数据访问对象 [DAO] 和 Microsoft 基础类 [MFC] 数据库类)。这同样适用于 SQL Server Native Client ODBC 驱动程序。在 ODBC 模型中,错误具有以下属性:

  • SQLSTATE

    SQLSTATE 是一个 5 个字符的错误代码,它最初是在 ODBC 规范中定义的。SQLSTATE 代码对所有 ODBC 驱动程序都是通用的,并为应用程序提供了一种编码基本错误处理的方法,而无需测试各种数据库返回的所有不同的错误代码。ODBC SQLSTATE 与数据库引擎错误消息的状态属性无关。

    ODBC 2.x 返回一组 SQLSTATE 代码,ODBC 3.x 返回符合 Open Group 数据管理方面的结构化查询语言 (SQL) 第 2 版标准的一组 SQLSTATE 代码。因为所有 ODBC 驱动程序都返回相同的 SQLSTATE 代码集合,所以将错误处理基于 SQLSTATE 代码的应用程序更易于移植。

  • 本机错误号

    本机错误号是来自基础数据库的错误号。ODBC 应用程序将收到的数据库引擎错误号作为本机错误号。

  • 错误消息字符串

    错误消息通过错误消息字符串参数返回。

当 ODBC 函数返回的状态不是 SQL_SUCCESS 时,应用程序可以调用 SQLGetDiagRec 来获得错误消息。例如,如果 ODBC 应用程序收到一个语法错误(SQL Server 错误号 170),SQLGetDiagRec 将返回以下结果。

szSqlState = 42000, pfNative = 170
szErrorMsg =
'[Microsoft][ODBC SQL Server Driver][SQL Server]
                                     Line 1: Incorrect syntax near *'

ODBC SQLGetDiagField 函数允许 ODBC 驱动程序在此驱动程序返回的诊断记录中指定驱动程序特定的诊断字段。SQL Server ODBC 驱动程序指定驱动程序特定的字段,以放置数据库引擎错误消息,如数据库引擎严重度和状态代码。

有关在 ODBC 应用程序中检索错误消息的详细信息,请参阅处理错误和消息

ADO 错误处理

ADO 使用错误对象和错误集合返回标准错误信息,如 SQLSTATE、本机错误号和错误消息字符串。这些信息与 ODBC 中的信息相同。ADO 不支持任何提供程序特定的错误接口;数据库引擎特定的错误信息(如严重度或状态)在 ADO 应用程序中不可用。

有关在 ADO 应用程序中检索错误消息的详细信息,请参阅处理错误和消息

OLE DB 错误处理

OLE DB 使用 IErrorInfo 接口返回标准错误信息,如 SQLSTATE、本机错误号和错误字符串。这些信息与 ODBC 中的信息相同。SQL Server 的 OLE DB 访问接口定义了一个 ISQLServerErrorInfo 接口,用来返回数据库引擎特定的信息,如严重度、状态、过程名称和行号。

有关在 OLE DB 应用程序中检索错误消息的详细信息,请参阅错误

SqlClient 错误处理

当SQL Server 数据库引擎引发未处理的错误时,SqlClient 托管提供程序将引发 SqlException 异常。通过 SqlException 类,应用程序可以检索有关服务器端生成的错误的信息,包括错误号、错误消息、错误严重度和其他异常上下文信息。

为了处理SQL Server 数据库引擎发送的警告或信息性消息,应用程序可以创建一个 SqlInfoMessageEventHandler 委托来侦听 SqlConnection 类上的 InfoMessage 事件。与异常情况相似,消息上下文信息(如严重度和状态)将作为参数传递到回调。