SQLSTATE

SQLSTATE 提供警告或錯誤原因的詳細資訊。 本手冊內的 SQLSTATE 係根據 ISO/IEF CLI 規格中所載之內容,不過以 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 清單及傳回這些 SQLSTATE 的函式,請參閱附錄 A:ODBC 錯誤碼。 如需各項函式可能傳回特定 SQLSTATE 之條件的詳細說明,請參閱該項函式。