SQLSTATE到底是什么意思

在访问SQLServer2000/2005的时候,总是会报告SQLSTATE=...,这个东西到底是什么意思?

SQL92 规范中就已经明确规定了 SQLSTATE。

在SQLServer 2000的联机丛书中,解释ODBC错误信息的时候说到:

根据 X/Open 和 SQL Access Group SQL CAE 规范 (1992) 所进行的定义,SQLERROR 返回 SQLSTATE 值。SQLSTATE 值是包含五个字符的字符串。下表列出了驱动程序可以为 SQLError 返回的 SQLSTATE 值。

为 SQLSTATE 返回的字符串值由两个字符的类值后接三个字符的子类值组成。类值 01 表明是一种警告,后跟随 SQL_SUCCESS_WITH_INFO 的返回代码。只要类值不是 01(IM 除外),则表明是一种错误,后跟随 SQL_ERROR 的返回代码。类 IM 专门用于表明从 ODBC 实现产生的警告和错误。任何类中子类值 000 均用于实现给定类中所定义条件。这种类值和子类值的分配方法由 SQL-92 定义。



升级到SQL 2005以后的SQLSTATE有了变化,google sqlstate odbc3.x mapping时可以得到msdn上提供的从odbc2.x 到odbc 3.x 过程中SQLSTATE的变化映射。在这篇文章的开头这样说的:

In ODBC 3.x, HYxxx SQLSTATEs are returned instead of S1xxx, and 42Sxx SQLSTATEs are returned instead of S00XX. This was done to align with X/Open and ISO standards. In many cases, the mapping is not one-to-one because the standards have redefined the interpretation of several SQLSTATEs.


所以说如果想知道返回的SQLSTATE到底是怎么回事,查上述两篇文章可以知道个大概齐。

此外应用从ODBC2.x升级到ODBC3.x的时候,如果原先根据返回的SQLSTATE做了相应的逻辑,现在得改一下。好在SQLServer提供了一个让程序员偷懒的办法,把环境变量设置SQL_ATTR_ODBC_VERSION设置成为SQL_OV_ODBC2,这样底层驱动会返回原来ODBC 2.x的SQLSTATE。

关于这一点,原话是这样说的:

When an ODBC 2.x application is upgraded to an ODBC 3.x application, the application has to be changed to expect ODBC 3.x SQLSTATEs instead of ODBC 2.x SQLSTATEs. The following table lists the ODBC 3.x SQLSTATEs that each ODBC 2.x SQLSTATE is mapped to.
When the SQL_ATTR_ODBC_VERSION environment attribute is set to SQL_OV_ODBC2, the driver posts ODBC 2.x SQLSTATEs instead of ODBC 3.x SQLSTATEs when SQLGetDiagField or SQLGetDiagRec is called. A specific mapping can be determined by noting the ODBC 2.x SQLSTATE in column 1 of the following table that corresponds to the ODBC 3.x SQLSTATE in column 2.

你可能感兴趣的:(sql,Google,Access)