SQLite C 語言介面 中的許多常式會返回數值結果代碼,表示成功或失敗,並在失敗的情況下提供一些失敗原因的說明。本文檔旨在解釋每個數值結果代碼的含義。
「錯誤代碼」是「結果代碼」的子集,表示發生了錯誤。只有少數幾個非錯誤結果代碼:SQLITE_OK、SQLITE_ROW 和 SQLITE_DONE。「錯誤代碼」是指除了這三個以外的任何結果代碼。
結果代碼是 32 位元帶正負號的整數。結果代碼的最低有效 8 位元定義了一個廣泛的類別,稱為「主要結果代碼」。較高有效位元提供有關錯誤的更詳細資訊,稱為「延伸結果代碼」。
請注意,主要結果代碼始終是延伸結果代碼的一部分。給定一個完整的 32 位元延伸結果代碼,應用程式只需提取延伸結果代碼的最低有效 8 位元即可找到對應的主要結果代碼。
所有延伸結果代碼也是錯誤代碼。因此,「延伸結果代碼」和「延伸錯誤代碼」這兩個術語可以互換使用。
為了歷史相容性,C 語言介面預設返回主要結果代碼。可以使用 sqlite3_extended_errcode() 介面擷取最新錯誤的延伸結果代碼。可以使用 sqlite3_extended_result_codes() 介面將 資料庫連線 設定為返回延伸結果代碼而不是主要結果代碼的模式。
所有結果代碼都是整數。所有結果代碼的符號名稱都是使用 sqlite3.h 標頭檔中的「#define」宏建立的。sqlite3.h 標頭檔中有單獨的章節用於 結果代碼定義 和 延伸結果代碼定義。
主要結果代碼的符號名稱格式為「SQLITE_XXXXXX」,其中 XXXXXX 是一串大寫字母。延伸結果代碼名稱的格式為「SQLITE_XXXXXX_YYYYYYY」,其中 XXXXXX 部分是對應的主要結果代碼,YYYYYYY 是進一步分類結果代碼的延伸。
現有結果代碼的名稱和數值是固定且不變的。但是,新的結果代碼,尤其是新的延伸結果代碼,可能會出現在 SQLite 的未來版本中。
31 個結果代碼在 sqlite3.h 中定義,並按字母順序列舉如下:
74 個延伸結果代碼定義於 sqlite3.h 中,並以下列字母順序列出
SQLITE_OK 結果代碼表示操作成功,且沒有錯誤。大多數其他結果代碼表示錯誤。
SQLITE_ERROR 結果代碼是一個通用錯誤代碼,用於沒有其他更具體的錯誤代碼可用時。
SQLITE_INTERNAL 結果代碼表示內部故障。在正常運作的 SQLite 版本中,應用程式不應看到此結果代碼。如果應用程式確實遇到此結果代碼,則表示資料庫引擎中有錯誤。
此結果代碼可能是由 SQLite 中的錯誤引起的。然而,應用程式定義的 SQL 函式或虛擬表格,或VFS,或其他擴充功能也可能導致返回此結果代碼,因此問題可能不是核心 SQLite 的錯誤。
SQLITE_PERM 結果代碼表示無法提供新建立資料庫的請求存取模式。
SQLITE_ABORT 結果代碼表示操作在完成之前已中止,通常是由應用程式請求。另請參閱:SQLITE_INTERRUPT。
如果 sqlite3_exec() 的回呼函式返回非零值,則 sqlite3_exec() 將返回 SQLITE_ABORT。
如果在與待處理的讀取或寫入操作相同的資料庫連線上發生ROLLBACK操作,則待處理的讀取或寫入操作可能會失敗,並出現 SQLITE_ABORT 或 SQLITE_ABORT_ROLLBACK 錯誤。
除了作為結果代碼之外,SQLITE_ABORT 值也用作從 sqlite3_vtab_on_conflict() 介面返回的衝突解決模式。
SQLITE_BUSY 結果代碼表示由於其他資料庫連線(通常是另一個行程中的資料庫連線)的並行活動,資料庫檔案無法寫入(或在某些情況下無法讀取)。
例如,如果行程 A 正在進行大型寫入交易,同時行程 B 嘗試啟動新的寫入交易,行程 B 將收到 SQLITE_BUSY 結果,因為 SQLite 一次只支援一個寫入器。行程 B 需要等待行程 A 完成其交易後才能開始新的交易。sqlite3_busy_timeout() 和 sqlite3_busy_handler() 介面以及 busy_timeout pragma 可供行程 B 使用,以幫助其處理 SQLITE_BUSY 錯誤。
SQLITE_BUSY 錯誤可能在交易中的任何時間點發生:交易剛開始時、任何寫入或更新操作期間,或交易提交時。為了避免在交易過程中遇到 SQLITE_BUSY 錯誤,應用程式可以使用 BEGIN IMMEDIATE 而不是僅使用 BEGIN 來啟動交易。BEGIN IMMEDIATE 命令本身可能會返回 SQLITE_BUSY,但如果成功,則 SQLite 保證在同一個資料庫上通過下一個 COMMIT 的後續操作不會返回 SQLITE_BUSY。
另請參閱:SQLITE_BUSY_RECOVERY 和 SQLITE_BUSY_SNAPSHOT。
SQLITE_BUSY 結果代碼與 SQLITE_LOCKED 不同,SQLITE_BUSY 表示與個別的資料庫連線(可能在不同的行程中)發生衝突,而 SQLITE_LOCKED 表示在同一個資料庫連線內(或者有時是具有共用快取的資料庫連線)發生衝突。
SQLITE_LOCKED 結果代碼表示由於在同一個資料庫連線內發生衝突,或與使用共用快取的其他資料庫連線發生衝突,寫入操作無法繼續。
例如,當另一個執行緒正在同一個資料庫連線上讀取該表格時,無法執行 DROP TABLE 陳述式,因為刪除表格會從並行讀取器下方刪除該表格。
SQLITE_LOCKED 結果代碼與 SQLITE_BUSY 不同,SQLITE_LOCKED 表示在同一個資料庫連線上(或在具有共用快取的連線上)發生衝突,而 SQLITE_BUSY 表示與不同的資料庫連線(可能在不同的行程中)發生衝突。
SQLITE_NOMEM 結果代碼表示 SQLite 無法配置完成操作所需的所有記憶體。換句話說,在需要配置記憶體才能繼續操作的情況下,對 sqlite3_malloc() 或 sqlite3_realloc() 的內部呼叫失敗。
當嘗試更改目前資料庫連線沒有寫入權限的某些資料時,會返回 SQLITE_READONLY 結果代碼。
SQLITE_INTERRUPT 結果碼表示操作被 sqlite3_interrupt() 介面中斷。另請參閱:SQLITE_ABORT
SQLITE_IOERR 結果碼表示操作無法完成,因為作業系統回報了 I/O 錯誤。
磁碟機已滿通常會產生 SQLITE_FULL 錯誤,而不是 SQLITE_IOERR 錯誤。
I/O 錯誤有許多不同的擴展結果碼,可以識別失敗的特定 I/O 操作。
SQLITE_CORRUPT 結果碼表示資料庫檔案已損毀。有關損毀如何發生的更多討論,請參閱 如何損毀您的資料庫檔案。
SQLITE_NOTFOUND 結果碼以三種方式呈現
sqlite3_file_control() 介面可以返回 SQLITE_NOTFOUND,表示作為第三個參數傳遞的 檔案控制操作碼 未被底層的 VFS 識別。
sqlite3_vfs 物件的 xSetSystemCall() 方法也可以返回 SQLITE_NOTFOUND。
sqlite3_vtab_rhs_value() 可以返回 SQLITE_NOTFOUND,表示約束的右側運算元無法用於進行呼叫的 xBestIndex 方法。
SQLite 實作內部也會使用 SQLITE_NOTFOUND 結果碼,但這些內部用途不會公開給應用程式。
SQLITE_FULL 結果碼表示寫入無法完成,因為磁碟已滿。請注意,嘗試將資訊寫入主要資料庫檔案時可能會發生此錯誤,或者寫入 暫存磁碟檔案 時也可能會發生此錯誤。
有時即使主要磁碟空間充足,應用程式也會遇到此錯誤,因為在將檔案寫入 暫存磁碟檔案 時發生錯誤,而暫存檔案儲存在空間比主要磁碟小得多的獨立分割區上。
SQLITE_CANTOPEN 結果碼表示 SQLite 無法開啟檔案。有問題的檔案可能是主要資料庫檔案或數個 暫存磁碟檔案 之一。
SQLITE_PROTOCOL 結果碼表示 SQLite 使用的檔案鎖定協定出現問題。目前僅在使用 WAL 模式 並嘗試啟動新的交易時才會返回 SQLITE_PROTOCOL 錯誤。當兩個獨立的 資料庫連線 都嘗試在 WAL 模式 下同時啟動交易時,可能會發生競爭情況。競爭失敗者會退回並在短暫延遲後重試。如果同一個連線在幾秒鐘內多次輸掉鎖定競爭,最終它將放棄並返回 SQLITE_PROTOCOL。SQLITE_PROTOCOL 錯誤在實際應用中應該非常罕見,並且僅在許多獨立的行程都激烈競爭寫入同一個資料庫時才會出現。
SQLITE_SCHEMA 結果碼表示資料庫結構描述已變更。使用 sqlite3_prepare() 或 sqlite3_prepare16() 產生的 預準備語句 的 sqlite3_step() 可以返回此結果碼。如果在準備語句和執行語句之間,資料庫結構描述被其他行程變更,則可能會導致此錯誤。
如果預編譯語句是由 sqlite3_prepare_v2() 產生的,那麼當結構描述 (schema) 變更時,語句會自動重新編譯,最多 SQLITE_MAX_SCHEMA_RETRY 次(預設值:50)。只有在多次重試後仍然失敗的情況下,sqlite3_step() 介面才會將 SQLITE_SCHEMA 返回給應用程式。
SQLITE_TOOBIG 錯誤碼表示字串或 BLOB 太大。SQLite 中字串或 BLOB 的預設最大長度為 1,000,000,000 位元組。這個最大長度可以在編譯時使用 SQLITE_MAX_LENGTH 編譯選項更改,或在執行時使用 sqlite3_limit(db,SQLITE_LIMIT_LENGTH,...) 介面更改。當 SQLite 遇到超過編譯時或執行時限制的字串或 BLOB 時,就會產生 SQLITE_TOOBIG 錯誤。
當傳遞給 sqlite3_prepare_v2() 介面的 SQL 語句過大時,也會產生 SQLITE_TOOBIG 錯誤碼。SQL 語句的最大長度預設為較小的 1,000,000,000 位元組。SQL 語句的最大長度可以在編譯時使用 SQLITE_MAX_SQL_LENGTH 設定,或在執行時使用 sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,...) 設定。
SQLITE_CONSTRAINT 錯誤碼表示在嘗試處理 SQL 語句時發生了 SQL 約束違規。關於失敗約束的更多資訊,可以透過查閱隨附的錯誤訊息(透過 sqlite3_errmsg() 或 sqlite3_errmsg16() 返回)或查看延伸錯誤碼 來找到。
SQLITE_CONSTRAINT 碼也可以用作虛擬表格實作的 xBestIndex() 方法的返回值。當 xBestIndex() 返回 SQLITE_CONSTRAINT 時,表示提交給 xBestIndex() 的特定輸入組合無法產生可用的查詢計畫,不應進一步考慮。
SQLITE_MISMATCH 錯誤碼表示資料類型不匹配。
SQLite 通常對值類型與要儲存該值的容器的宣告類型之間的不匹配非常寬容。例如,SQLite 允許應用程式在宣告類型為 BOOLEAN 的欄位中儲存大型 BLOB。但在少數情況下,SQLite 對類型很嚴格。在類型不匹配的少數情況下,會返回 SQLITE_MISMATCH 錯誤。
表格的 rowid 必須是整數。嘗試將 rowid 設定為整數以外的任何值(或將自動轉換為下一個可用整數 rowid 的 NULL)會導致 SQLITE_MISMATCH 錯誤。
如果應用程式以未定義或不支援的方式使用任何 SQLite 介面,則可能會返回 SQLITE_MISUSE 返回碼。例如,在預編譯語句 已被 終結 後使用它可能會導致 SQLITE_MISUSE 錯誤。
SQLite 會嘗試偵測誤用並使用此結果碼報告誤用。但是,不保證誤用偵測會成功。誤用偵測是機率性的。應用程式不應依賴 SQLITE_MISUSE 返回值。
如果 SQLite 從任何介面返回 SQLITE_MISUSE,則表示應用程式編碼錯誤,需要修復。不要發布有時從標準 SQLite 介面返回 SQLITE_MISUSE 的應用程式,因為該應用程式包含潛在的嚴重錯誤。
在不支援大型檔案的系統上,當資料庫大小超過檔案系統可以處理的大小時,可能會返回 SQLITE_NOLFS 錯誤。「NOLFS」代表「不支援大型檔案」。
當 授權器回呼 指示未授權正在準備的 SQL 語句時,會返回 SQLITE_AUTH 錯誤。
SQLITE_FORMAT 錯誤碼目前未被 SQLite 使用。
SQLITE_RANGE 錯誤索引指出傳遞給 sqlite3_bind 函式系列的參數編號或 sqlite3_column 函式系列中的欄位編號超出範圍。
嘗試開啟檔案時,SQLITE_NOTADB 錯誤表示正在開啟的檔案似乎不是 SQLite 資料庫檔案。
任何 C/C++ 介面都不會返回 SQLITE_NOTICE 結果碼。然而,SQLITE_NOTICE(或者更確切地說是它的其中一個延伸錯誤碼)有時會被用作 sqlite3_log() 回呼函式中的第一個參數,表示正在進行不尋常的操作。
任何 C/C++ 介面都不會返回 SQLITE_WARNING 結果碼。然而,SQLITE_WARNING(或者更確切地說是它的其中一個延伸錯誤碼)有時會被用作 sqlite3_log() 回呼函式中的第一個參數,表示正在進行不尋常且可能不明智的操作。
sqlite3_step() 返回的 SQLITE_ROW 結果碼表示有另一列輸出可用。
SQLITE_DONE 結果碼表示操作已完成。SQLITE_DONE 結果碼最常見的是作為 sqlite3_step() 的傳回值,表示 SQL 陳述式已執行完成。但 SQLITE_DONE 也可能由其他多步驟介面返回,例如 sqlite3_backup_step()。
sqlite3_load_extension() 介面會將擴充功能載入到單個資料庫連線中。預設行為是當資料庫連線關閉時自動卸載該擴充功能。但是,如果擴充功能的進入點返回 SQLITE_OK_LOAD_PERMANENTLY 而不是 SQLITE_OK,則擴充功能在資料庫連線關閉後仍會載入到行程的位址空間中。換句話說,當資料庫連線關閉時,不會針對擴充功能呼叫 sqlite3_vfs 物件的 xDlClose 方法。
SQLITE_OK_LOAD_PERMANENTLY 傳回碼對於註冊新的 VFS 的可載入擴充功能 很有用,例如。
SQLITE_ERROR_MISSING_COLLSEQ 結果碼表示無法準備 SQL 陳述式,因為在該 SQL 陳述式中指定的排序序列找不到。
有時遇到此錯誤碼時,sqlite3_prepare_v2() 函式會將錯誤轉換為 SQLITE_ERROR_RETRY,並嘗試使用不需要使用未知排序序列的不同查詢計劃再次準備 SQL 陳述式。
SQLITE_BUSY_RECOVERY 錯誤碼是 SQLITE_BUSY 的延伸錯誤碼,表示操作無法繼續,因為另一個行程正忙於在當機後恢復 WAL 模式 資料庫檔案。SQLITE_BUSY_RECOVERY 錯誤碼僅發生在 WAL 模式 資料庫上。
SQLITE_LOCKED_SHAREDCACHE 結果碼表示對 SQLite 資料記錄的存取被另一個在 共用快取模式 下使用相同記錄的資料庫連線所阻止。當兩個或多個資料庫連線共用相同的快取,並且其中一個連線正在修改該快取中的記錄時,其他連線會被阻止存取該資料,以防止讀取器看到損壞或部分完成的變更。
SQLITE_READONLY_RECOVERY 錯誤碼是 延伸錯誤碼,用於 SQLITE_READONLY。SQLITE_READONLY_RECOVERY 錯誤碼表示無法開啟 WAL 模式 的資料庫,因為資料庫檔案需要修復,而修復需要寫入權限,但目前只有讀取權限可用。
SQLITE_IOERR_READ 錯誤碼是 延伸錯誤碼,用於 SQLITE_IOERR,表示在 虛擬檔案系統 (VFS) 層嘗試從磁碟上的檔案讀取時發生 I/O 錯誤。此錯誤可能是硬體故障或檔案系統在檔案開啟時被卸載所導致。
SQLITE_CORRUPT_VTAB 錯誤碼是 延伸錯誤碼,用於 SQLITE_CORRUPT,由 虛擬表格 使用。虛擬表格可能會返回 SQLITE_CORRUPT_VTAB 表示虛擬表格中的內容已損毀。
SQLITE_CANTOPEN_NOTEMPDIR 錯誤碼已不再使用。
SQLITE_CONSTRAINT_CHECK 錯誤碼是 延伸錯誤碼,用於 SQLITE_CONSTRAINT,表示 CHECK 約束 失敗。
SQLITE_AUTH_USER 錯誤碼是 延伸錯誤碼,用於 SQLITE_AUTH,表示嘗試在已登入使用者缺乏足夠授權的資料庫上執行操作。
當 WAL 模式 的資料庫檔案被修復時,SQLITE_NOTICE_RECOVER_WAL 結果碼會傳遞給 sqlite3_log() 的回呼函式。
每當使用 自動索引 時,SQLITE_WARNING_AUTOINDEX 結果碼會傳遞給 sqlite3_log() 的回呼函式。這可以作為對應用程式設計人員的警告,提示資料庫可能受益於額外的索引。
SQLITE_ERROR_RETRY 在內部用於促使 sqlite3_prepare_v2()(或其用於建立預備陳述式的兄弟函式)再次嘗試準備先前嘗試因錯誤而失敗的陳述式。
SQLITE_ABORT_ROLLBACK 錯誤碼是 延伸錯誤碼,用於 SQLITE_ABORT,表示 SQL 陳述式中止,因為在 SQL 陳述式首次啟動時處於作用中的交易已回復。當發生回復時,待處理的寫入操作總是會以這個錯誤失敗。只有當在被回復的交易中變更了結構描述時,ROLLBACK 才會導致待處理的讀取操作失敗。
SQLITE_BUSY_SNAPSHOT 錯誤碼是 延伸錯誤碼,用於 SQLITE_BUSY,發生在 WAL 模式 的資料庫上,當資料庫連線嘗試將讀取交易提升為寫入交易時,卻發現另一個 資料庫連線 已經寫入到資料庫,從而使先前的讀取失效。
以下案例說明了 SQLITE_BUSY_SNAPSHOT 錯誤可能發生的情況:
SQLITE_LOCKED_VTAB 結果碼不被 SQLite 核心使用,但可供擴充功能使用。虛擬表格實作可以返回此結果碼,表示它們由於其他執行緒或程序持有的鎖定而無法完成目前的操作。
當嘗試在另一個已準備好的語句正在讀取 R-Tree 時更新 R-Tree,R-Tree 擴充功能會返回此結果代碼。 更新無法繼續,因為對 R-Tree 的任何更改都可能涉及節點的重新排列和重新平衡,這會破壞讀取游標,導致某些列重複而其他列被省略。
SQLITE_READONLY_CANTLOCK 錯誤碼是 SQLITE_READONLY 的延伸錯誤碼。 SQLITE_READONLY_CANTLOCK 錯誤碼表示 SQLite 無法在 WAL 模式 資料庫上取得讀取鎖定,因為與該資料庫關聯的共享記憶體檔案是唯讀的。
SQLITE_IOERR_SHORT_READ 錯誤碼是 SQLITE_IOERR 的延伸錯誤碼,表示在 VFS 層中的讀取嘗試無法取得所要求的位元組數。 這可能是由於檔案被截斷所致。
SQLITE_CORRUPT_SEQUENCE 結果代碼表示 sqlite_sequence 表的結構已損毀。 sqlite_sequence 表用於協助實現 AUTOINCREMENT 功能。 sqlite_sequence 表應具有以下格式
CREATE TABLE sqlite_sequence(name,seq);
如果 SQLite 發現 sqlite_sequence 表具有任何其他格式,則會返回 SQLITE_CORRUPT_SEQUENCE 錯誤。
SQLITE_CANTOPEN_ISDIR 錯誤碼是 SQLITE_CANTOPEN 的延伸錯誤碼,表示檔案開啟操作失敗,因為該檔案實際上是一個目錄。
SQLITE_CONSTRAINT_COMMITHOOK 錯誤碼是 SQLITE_CONSTRAINT 的延伸錯誤碼,表示 提交鉤子回呼 返回非零值,從而導致 SQL 陳述式被回滾。
當 熱日誌 被回滾時,SQLITE_NOTICE_RECOVER_ROLLBACK 結果代碼會傳遞到 sqlite3_log() 的回呼。
嘗試使用 sqlite3_snapshot_open() 介面在資料庫的歷史版本上啟動讀取交易時,可能會返回 SQLITE_ERROR_SNAPSHOT 結果代碼。 如果歷史快照不再可用,則讀取交易將失敗並顯示 SQLITE_ERROR_SNAPSHOT。 僅當使用 -DSQLITE_ENABLE_SNAPSHOT 編譯 SQLite 時,才可能出現此錯誤碼。
SQLITE_BUSY_TIMEOUT 錯誤碼表示 VFS 層中的阻塞 Posix 諮詢檔案鎖定請求由於逾時而失敗。 阻塞 Posix 諮詢鎖定僅作為專有的 SQLite 擴充功能提供,即使如此,也僅在使用 SQLITE_EANBLE_SETLK_TIMEOUT 編譯時選項編譯 SQLite 時才支援。
SQLITE_READONLY_ROLLBACK 錯誤碼是 SQLITE_READONLY 的延伸錯誤碼。 SQLITE_READONLY_ROLLBACK 錯誤碼表示無法開啟資料庫,因為它有一個需要回滾的 熱日誌,但由於資料庫是唯讀的而無法回滾。
SQLITE_IOERR_WRITE 錯誤碼是 SQLITE_IOERR 的延伸錯誤碼,表示在 VFS 層中嘗試寫入磁碟上的檔案時發生 I/O 錯誤。 此錯誤可能是由於硬體故障或檔案系統在檔案開啟時被卸載所致。 如果檔案系統已滿,則不應發生此錯誤,因為存在單獨的錯誤碼 (SQLITE_FULL) 用於此目的。
SQLITE_CORRUPT_INDEX 結果代碼表示 SQLite 偵測到索引中遺失了一個或多個項目。這是 SQLITE_CORRUPT 錯誤代碼的一個特例,它表示如果資料庫檔案中沒有其他問題存在,則可以透過執行 REINDEX 命令來解決此問題。
SQLITE_CANTOPEN_FULLPATH 錯誤代碼是 SQLITE_CANTOPEN 的 延伸錯誤代碼,表示檔案開啟操作失敗,因為作業系統無法將檔名轉換為完整路徑名稱。
SQLITE_CONSTRAINT_FOREIGNKEY 錯誤代碼是 SQLITE_CONSTRAINT 的 延伸錯誤代碼,表示 外部鍵約束 失敗。
SQLITE_READONLY_DBMOVED 錯誤代碼是 SQLITE_READONLY 的 延伸錯誤代碼。 SQLITE_READONLY_DBMOVED 錯誤代碼表示無法修改資料庫,因為資料庫檔案自開啟後已被移動,因此任何修改資料庫的嘗試都可能導致資料庫損毀,如果程序當機,因為 回滾日誌 的名稱將不正確。
SQLITE_IOERR_FSYNC 錯誤代碼是 SQLITE_IOERR 的 延伸錯誤代碼,表示在 VFS 層嘗試將先前寫入的內容從作業系統和/或磁碟控制緩衝區刷新到永久儲存裝置時發生 I/O 錯誤。換句話說,此代碼表示 unix 中的 fsync() 系統呼叫或 Windows 中的 FlushFileBuffers() 系統呼叫出現問題。
SQLITE_CANTOPEN_CONVPATH 錯誤代碼是 SQLITE_CANTOPEN 的 延伸錯誤代碼,僅由 Cygwin VFS 使用,表示 cygwin_conv_path() 系統呼叫在嘗試開啟檔案時失敗。另請參閱:SQLITE_IOERR_CONVPATH
SQLITE_CONSTRAINT_FUNCTION 錯誤代碼目前未被 SQLite 核心使用。但是,此錯誤代碼可供擴充函式使用。
SQLITE_READONLY_CANTINIT 結果代碼源自 VFS 的 xShmMap 方法,表示 WAL 模式 使用的共享記憶體區域存在,但其內容不可靠且無法被目前程序使用,因為目前程序沒有共享記憶體區域的寫入權限。(WAL 模式的共享記憶體區域通常是一個以「-wal」為後綴的檔案,該檔案被記憶體映射到程序空間中。如果目前程序沒有該檔案的寫入權限,則它無法寫入共享記憶體。)
SQLite 中的更高層級邏輯通常會攔截錯誤代碼並建立一個暫時的記憶體內共享記憶體區域,以便目前程序至少可以讀取資料庫的內容。此結果代碼不應到達應用程式介面層。
SQLITE_IOERR_DIR_FSYNC 錯誤代碼是 SQLITE_IOERR 的 延伸錯誤代碼,表示在 VFS 層嘗試在目錄上呼叫 fsync() 時發生 I/O 錯誤。Unix VFS 會在建立或刪除某些檔案後嘗試對目錄執行 fsync(),以確保這些檔案在斷電或系統當機後仍會出現在檔案系統中。此錯誤代碼表示嘗試執行該 fsync() 時出現問題。
SQLITE_CANTOPEN_DIRTYWAL 結果代碼目前未使用。
SQLITE_CONSTRAINT_NOTNULL 錯誤代碼是 SQLITE_CONSTRAINT 的 延伸錯誤代碼,表示 NOT NULL 約束 失敗。
SQLITE_READONLY_DIRECTORY 結果代碼表示資料庫為唯讀狀態,因為處理程序沒有權限在與資料庫相同的目錄中建立日誌檔案,而建立日誌檔案是寫入資料庫的先決條件。
SQLITE_IOERR_TRUNCATE 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_IOERR,指出在 VFS 層嘗試將檔案截斷為較小大小時發生 I/O 錯誤。
當使用 sqlite3_open() 介面及其相關介面,且資料庫檔案為符號連結,並使用了 SQLITE_OPEN_NOFOLLOW 旗標時,會返回 SQLITE_CANTOPEN_SYMLINK 結果代碼。
SQLITE_CONSTRAINT_PRIMARYKEY 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_CONSTRAINT,指出 PRIMARY KEY 限制 失敗。
SQLITE_IOERR_FSTAT 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_IOERR,指出在 VFS 層嘗試對檔案呼叫 fstat()(或等效函式)以確定檔案大小或存取權限等資訊時發生 I/O 錯誤。
SQLITE_CONSTRAINT_TRIGGER 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_CONSTRAINT,指出 觸發器 中的 RAISE 函式 觸發,導致 SQL 陳述式中止。
SQLITE_IOERR_UNLOCK 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_IOERR,指出 sqlite3_io_methods 物件的 xUnlock 方法中發生 I/O 錯誤。
SQLITE_CONSTRAINT_UNIQUE 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_CONSTRAINT,指出 UNIQUE 限制 失敗。
SQLITE_IOERR_RDLOCK 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_IOERR,指出在 sqlite3_io_methods 物件的 xLock 方法嘗試取得讀取鎖定時發生 I/O 錯誤。
SQLITE_CONSTRAINT_VTAB 錯誤代碼目前未被 SQLite 核心使用。但是,此錯誤代碼可供應用程式定義的 虛擬表格 使用。
SQLITE_IOERR_DELETE 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_IOERR,指出 sqlite3_vfs 物件的 xDelete 方法中發生 I/O 錯誤。
SQLITE_CONSTRAINT_ROWID 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_CONSTRAINT,指出 rowid 並非唯一。
SQLITE_IOERR_BLOCKED 錯誤代碼已不再使用。
SQLITE_CONSTRAINT_PINNED 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_CONSTRAINT,指出 UPDATE 觸發器 嘗試在更新過程中刪除正在更新的資料列。
VFS 層有時會返回 SQLITE_IOERR_NOMEM 錯誤代碼,表示由於無法配置足夠的記憶體而無法完成操作。此錯誤代碼通常會被 SQLite 的上層轉換為 SQLITE_NOMEM,然後再返回給應用程式。
SQLITE_CONSTRAINT_DATATYPE 錯誤代碼是 擴展錯誤代碼,用於表示 SQLITE_CONSTRAINT,指出插入或更新嘗試在定義為 STRICT 的表格中儲存與欄位宣告類型不一致的值。
SQLITE_IOERR_ACCESS 錯誤碼是 延伸錯誤碼,用於表示 sqlite3_vfs 物件上 xAccess 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_CHECKRESERVEDLOCK 錯誤碼是 延伸錯誤碼,用於表示 sqlite3_io_methods 物件上 xCheckReservedLock 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_LOCK 錯誤碼是 延伸錯誤碼,用於表示檔案建議鎖定邏輯中的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。通常 SQLITE_IOERR_LOCK 錯誤表示取得 PENDING 鎖 時發生問題。然而,它也可能表示在 Mac 上使用的某些特殊 VFS 上的各種鎖定錯誤。
SQLITE_IOERR_CLOSE 錯誤碼是 延伸錯誤碼,用於表示 sqlite3_io_methods 物件上 xClose 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_DIR_CLOSE 錯誤碼已不再使用。
SQLITE_IOERR_SHMOPEN 錯誤碼是 延伸錯誤碼,用於表示在嘗試開啟新的共享記憶體區段時,sqlite3_io_methods 物件上 xShmMap 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_SHMSIZE 錯誤碼是 延伸錯誤碼,用於表示在 WAL 模式 交易處理過程中,嘗試擴大 「shm」檔案 時,sqlite3_io_methods 物件上 xShmMap 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。這個錯誤可能表示底層檔案系統磁碟區空間不足。
SQLITE_IOERR_SHMLOCK 錯誤碼已不再使用。
SQLITE_IOERR_SHMMAP 錯誤碼是 延伸錯誤碼,用於表示在嘗試將共享記憶體區段映射到處理程序位址空間時,sqlite3_io_methods 物件上 xShmMap 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_SEEK 錯誤碼是 延伸錯誤碼,用於表示在嘗試將檔案描述器指向讀取或寫入開始點時,sqlite3_io_methods 物件上 xRead 或 xWrite 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_DELETE_NOENT 錯誤碼是 延伸錯誤碼,用於表示 sqlite3_vfs 物件上的 xDelete 方法失敗,因為要刪除的檔案不存在,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_MMAP 錯誤碼是 延伸錯誤碼,用於表示在嘗試將部分資料庫檔案映射或取消映射到處理程序位址空間時,sqlite3_io_methods 物件上 xFetch 或 xUnfetch 方法內的 I/O 錯誤,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_GETTEMPPATH 錯誤碼是 延伸錯誤碼,用於表示 VFS 無法判斷放置暫存檔的合適目錄,它是 SQLITE_IOERR 的延伸。
SQLITE_IOERR_CONVPATH 錯誤碼是 延伸錯誤碼,僅由 Cygwin VFS 使用,表示 cygwin_conv_path() 系統呼叫失敗,它是 SQLITE_IOERR 的延伸。另請參閱:SQLITE_CANTOPEN_CONVPATH
SQLITE_IOERR_VNODE 錯誤碼是保留給擴充套件使用的代碼,SQLite 核心並未使用。
SQLITE_IOERR_AUTH 錯誤碼是保留給擴充套件使用的代碼,SQLite 核心並未使用。
SQLITE_IOERR_BEGIN_ATOMIC 錯誤碼表示底層作業系統在 SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 檔案控制上回報錯誤。僅當 SQLITE_ENABLE_ATOMIC_WRITE 啟用且資料庫位於支援原子寫入的檔案系統上時,才會發生此錯誤。
SQLITE_IOERR_COMMIT_ATOMIC 錯誤碼表示底層作業系統在 SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 檔案控制上回報錯誤。僅當 SQLITE_ENABLE_ATOMIC_WRITE 啟用且資料庫位於支援原子寫入的檔案系統上時,才會發生此錯誤。
SQLITE_IOERR_ROLLBACK_ATOMIC 錯誤碼表示底層作業系統在 SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 檔案控制上回報錯誤。僅當 SQLITE_ENABLE_ATOMIC_WRITE 啟用且資料庫位於支援原子寫入的檔案系統上時,才會發生此錯誤。
SQLITE_IOERR_DATA 錯誤碼是 擴充錯誤碼,用於 SQLITE_IOERR,僅由 checksum VFS shim 使用,表示資料庫檔案頁面上的 checksum 錯誤。
SQLITE_IOERR_CORRUPTFS 錯誤碼是 擴充錯誤碼,用於 SQLITE_IOERR,僅由 VFS 使用,表示搜尋或讀取失敗是由於請求超出檔案邊界,而不是一般的裝置故障。這通常表示檔案系統損毀。
本頁面最後修改時間:2024-08-14 17:04:32 UTC