SQLSTATE 提供關於警告或錯誤原因的詳細資訊。 本手冊中的 SQLSTATE 是基於 ISO/IEF CLI 規範中的,雖然以 IM 開頭的 SQLSTATE 是專門針對 ODBC 的。
與返回碼不同,本手冊中的 SQLSTATE 僅為指引,驅動程式不需返回它們。 因此,雖然驅動程式應該回傳所有能偵測到的錯誤或警告的正確 SQLSTATE,但應用程式不應預設這總是會發生。 造成這種情況的原因有兩個:
不完備性 雖然這本手冊列出了大量錯誤與警告及其可能的原因,但它並不完整,且很可能永遠不會完整;驅動程式的實作差異太大了。 任何驅動程式大概不會回傳本手冊中列出的所有 SQLSTATE,甚至可能回傳本手冊中未列出的 SQLSTATE。
複雜度 有些資料庫引擎——尤其是關聯式資料庫引擎——會回傳成千上萬個錯誤和警告。 由於工作量大、映射不精確、程式碼大小龐大,且程式碼價值低,導致執行時不應該遇到的程式錯誤,這類引擎的驅動程式不太可能將所有錯誤與警告映射到 SQLSTATE。 因此,驅動程式應盡可能多地映射錯誤與警告,並確保這些錯誤與警告可能基於哪些應用邏輯,例如 SQLSTATE 01004(資料截斷)。
由於 SQLSTATE 不會被可靠回傳,大多數應用程式只會將 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,請參見該函式。