int sqlite3_errcode(sqlite3 *db); int sqlite3_extended_errcode(sqlite3 *db); const char *sqlite3_errmsg(sqlite3*); const void *sqlite3_errmsg16(sqlite3*); const char *sqlite3_errstr(int); int sqlite3_error_offset(sqlite3 *db);
如果與資料庫連線 D 相關聯的最近一次 sqlite3_* API 呼叫失敗,則 sqlite3_errcode(D) 介面會傳回該 API 呼叫的數字結果碼或延伸結果碼。 sqlite3_extended_errcode() 介面也相同,只不過它即使在停用延伸結果碼的情況下,也會一律傳回延伸結果碼。
sqlite3_errcode() 和/或 sqlite3_extended_errcode() 傳回的值可能會隨著每次 API 呼叫而改變。不過,有些介面保證永遠不會改變錯誤碼的值。保留錯誤碼的介面包括:
sqlite3_errmsg() 和 sqlite3_errmsg16() 分別以 UTF-8 或 UTF-16 傳回描述錯誤的英文文字,如果沒有可用的錯誤訊息,則傳回 NULL。(關於此規則的例外情況,請參閱 SQLite 如何處理無效的 UTF。)錯誤訊息字串的記憶體是由內部管理的。應用程式不需要擔心釋放結果。但是,錯誤字串可能會被後續呼叫其他 SQLite 介面函式覆寫或釋放。
sqlite3_errstr(E) 介面會以 UTF-8 傳回描述結果碼 E 的英文文字,如果 E 不是具有文字錯誤訊息的結果碼,則傳回 NULL。錯誤訊息字串的記憶體是由內部管理的,應用程式不得釋放它。
如果最近的錯誤參考輸入 SQL 中的特定語彙單元,sqlite3_error_offset() 介面會傳回該語彙單元起始的位元組偏移量。 sqlite3_error_offset() 傳回的位元組偏移量假設輸入 SQL 為 UTF8。如果最近的錯誤沒有參考輸入 SQL 中的特定語彙單元,則 sqlite3_error_offset() 函式會傳回 -1。
使用序列化執行緒模式時,可能在第一個錯誤發生與呼叫這些介面之間,另一個執行緒發生第二個錯誤。發生這種情況時,由於這些介面一律回報最近的結果,因此將會回報第二個錯誤。為了避免這種情況,每個執行緒可以在開始使用 D 之前呼叫 sqlite3_mutex_enter(sqlite3_db_mutex(D)) 來取得資料庫連線 D 的獨佔使用權,並在完成所有對此處列出的介面的呼叫之後呼叫 sqlite3_mutex_leave(sqlite3_db_mutex(D))。
如果介面因 SQLITE_MISUSE 而失敗,則表示應用程式錯誤地呼叫了該介面。在這種情況下,錯誤碼和訊息可能會設定,也可能不會設定。