SQLSTATEs

SQLSTATEs 提供有关警告或错误原因的详细信息。 本手册中的 SQLSTATE 基于 ISO/IEF CLI 规范中找到的 SQLSTATE,但以 IM 开头的 SQLSTATE 特定于 ODBC。

与返回代码不同,本手册中的 SQLSTATE 是指南,驱动程序不需要返回它们。 因此,尽管驱动程序应返回其能够检测到的任何错误或警告的正确 SQLSTATE,但应用程序不应依赖这种情况总是会发生。 这种情况的原因有两倍:

  • 不完整 虽然此手册列出了大量错误和警告以及这些错误和警告的可能原因,但它不完整,可能永远不会:驱动程序实现只是变化太多。 任何给定的驱动程序都可能不会返回此手册中列出的所有 SQLSTATE,并且可能会返回此手册中未列出的 SQLSTATE。

  • 复杂性 某些数据库引擎(尤其是关系数据库引擎)返回数千个错误和警告。 此类引擎的驱动程序不太可能将所有这些错误和警告映射到 SQLSTATE,因为所涉及的工作量、映射的不精确性、生成的代码的大小大以及生成的代码的低值,这通常返回在运行时不应遇到的编程错误。 因此,驱动程序应映射尽可能多的错误和警告(看似合理),并确保映射应用程序逻辑可能基于的错误和警告,例如 SQLSTATE 01004(数据截断)。

由于 SQLSTATE 未可靠地返回,因此大多数应用程序只需向用户显示它们及其关联的诊断消息,这通常针对发生的特定错误或警告以及本机错误代码进行定制。 这样做很少会丢失任何功能,因为应用程序无论如何都无法在大多数 SQLSTATE 上基于编程逻辑。 例如,假设 SQLExecDirect 返回 SQLSTATE 42000(语法错误或访问冲突)。 如果导致此错误的 SQL 语句由应用程序硬编码或生成,则这是一个编程错误,需要修复代码。 如果用户输入了 SQL 语句,则这是用户错误,应用程序已通过通知用户问题来尽可能地完成其所有职责。

当应用程序对 SQLSTATE 执行基本编程逻辑时,应为不返回 SQLSTATE 或返回其他 SQLSTATE 做好准备。 基于许多驱动程序的经验积累,可以判断哪些 SQLSTATE 能够被可靠返回。 但是,一般来说,与数据源相比,发生在驱动程序或驱动程序管理器中的错误的 SQLSTATE 更可能被可靠地返回。 例如,大多数驱动程序可能返回 SQLSTATE HYC00(未实现可选功能),而更少的驱动程序可能会返回 SQLSTATE 42021(列已存在)。

以下 SQLSTATE 表示运行时错误或警告,是用于编写编程逻辑的良好选择。 但是,不能保证所有驱动程序都返回它们。

  • 01004 (数据截断)

  • 01S02 (选项值已更改)

  • HY008 (作已取消)

  • HYC00 (未实现可选功能)

  • HYT00 (超时已过期)

SQLSTATE HYC00(未实现可选功能)尤其重要,因为它是唯一的应用程序可以确定驱动程序是否支持特定语句或连接属性的方式。

有关 SQLSTATE 的完整列表以及返回哪些函数,请参阅 附录 A:ODBC 错误代码。 有关每个函数可能返回特定 SQLSTATE 的条件的详细说明,请参阅该函数。