诊断记录和字段
诊断记录与 ODBC 环境、连接、语句或描述符句柄关联。当任何 ODBC 函数产生的返回代码不是 SQL_SUCCESS 或 SQL_INVALID_HANDLE 时,该函数调用的句柄就有相关联的诊断记录,其中包含信息性或错误性消息。这些记录会一直保留,直到要通过该句柄调用其他函数,那时,记录就会被丢弃。与一个句柄任一次调用相关联的诊断记录数目不受限制。
有两种类型的诊断记录:标题和状态。标题记录为记录 0;状态记录为记录 1 及更大数字。诊断记录包含适用于标题记录和状态记录的不同字段。ODBC 组件还可以定义自己的诊断记录字段。
标题记录中的字段包含有关函数执行的一般信息,包括返回代码、行计数、状态记录数和所执行的语句的类型。除非 ODBC 函数返回 SQL_INVALID_HANDLE,否则,总是会创建标题记录。有关标题记录中字段的完整列表,请参阅SQLGetDiagField。
状态记录中的字段包含关于 ODBC 驱动程序管理器、驱动程序或数据源返回的特定错误或警告的信息,包括 SQLSTATE、本机错误号、诊断消息、列号和行号。仅当函数返回 SQL_ERROR, SQL_SUCCESS_WITH_INFO、SQL_NO_DATA、SQL_NEED_DATA 或 SQL_STILL_EXECUTING 时,才会创建状态记录。有关状态记录中字段的完整列表,请参阅 SQLGetDiagField。
SQLGetDiagRec 检索一条诊断记录及其 ODBC SQLSTATE、本机错误号和诊断消息字段。此功能类似于 ODBC 2.xSQLError 函数。ODBC 3.x 中最简单的错误处理函数是重复调用 SQLGetDiagRec,从RecNumber 参数设置为 1 开始,然后按 1 递增 RecNumber,直到 SQLGetDiagRec 返回 SQL_NO_DATA。这等效于 ODBC 2.x 应用程序调用 SQLError,直到其返回 SQL_NO_DATA_FOUND。
ODBC 3.x 支持的诊断信息比 ODBC 2.x 多很多。此信息存储在诊断记录的其他字段中,可以通过 SQLGetDiagField 检索。
SQL Server Native Client ODBC 驱动程序有特定于驱动程序的诊断字段,可以通过 SQLGetDiagField 检索。这些特定于驱动程序的字段的标签在 sqlncli.h 中定义。使用这些标签可以检索与每条诊断记录关联的 SQL Server 状态、严重级别、服务器名称、过程名称和行号。此外,如果应用程序调用SQLGetDiagField 时将 DiagIdentifier 设置为 SQL_DIAG_DYNAMIC_FUNCTION_CODE,sqlncli.h 还将包含驱动程序用于标识 Transact-SQL 语句的代码定义。
SQLGetDiagField 由 ODBC 驱动程序管理器通过从基础驱动程序捕获的错误信息进行处理。在成功连接之前,ODBC 驱动程序管理器不会缓存特定于驱动程序的诊断字段。如果在连接成功完成之前,调用 SQLGetDiagField 来获取特定于驱动程序的诊断字段,将返回 SQL_ERROR。如果 ODBC 连接函数返回 SQL_SUCCESS_WITH_INFO,则该连接函数特定于驱动程序的诊断字段尚不可用。只有在连接函数后已经进行了其他 ODBC 函数调用,才能开始调用 SQLGetDiagField 获取特定于驱动程序的诊断字段。
SQL Server Native Client ODBC 驱动程序报告的大多数错误只需使用 SQLGetDiagRec 返回的信息即可有效诊断。不过,在有些情况下,特定于驱动程序的诊断字段返回的信息对于诊断错误非常重要。为使用 SQL Server Native Client ODBC 驱动程序的应用程序编写 ODBC 错误处理程序时,使用 SQLGetDiagField 至少检索特定于驱动程序的 SQL_DIAG_SS_MSGSTATE 和 SQL_DIAG_SS_SEVERITY 字段也是一个好办法。如果特定错误可以在 SQL Server 代码的多个位置引发,SQL_DIAG_SS_MSGSTATE 会为 Microsoft 支持工程师专门指示错误的引发位置,有时,这有助于诊断问题。