SQLSTATE到底是什麼意思

在訪問SQLServer2000/2005的時候,總是會報告SQLSTATE=...,這個東西到底是什麼意思?

SQL92 規範中就已經明確規定了 SQLSTATE。

在SQLServer 2000的聯機叢書中,解釋ODBC錯誤信息的時候說到:

[u]根據 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 定義。[/u]


升級到SQL 2005以後的SQLSTATE有了變化,google sqlstate odbc3.x mapping時可以得到msdn上提供的從odbc2.x 到odbc 3.x 過程中SQLSTATE的變化映射。在這篇文章的開頭這樣說的:

[u]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.
[/u]

所以說如果想知道返回的SQLSTATE到底是怎麼回事,查上述兩篇文章可以知道個大概齊。

此外應用從ODBC2.x升級到ODBC3.x的時候,如果原先根據返回的SQLSTATE做了相應的邏輯,現在得改一下。好在SQLServer提供了一個讓程序員偷懶的辦法,把環境變量設置SQL_ATTR_ODBC_VERSION設置成爲SQL_OV_ODBC2,這樣底層驅動會返回原來ODBC 2.x的SQLSTATE。

關於這一點,原話是這樣說的:

[u]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.[/u]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章