int sqlite3_blob_open( sqlite3*, const char *zDb, const char *zTable, const char *zColumn, sqlite3_int64 iRow, int flags, sqlite3_blob **ppBlob );
此介面會開啟一個控制代碼,指向位於資料庫 zDb 中表格 zTable 的第 iRow 列、zColumn 欄的 BLOB;換句話說,也就是與以下查詢指令所選取的 BLOB 相同:
SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;
參數 zDb 不是包含資料庫的檔案名稱,而是資料庫的符號名稱。對於附加的資料庫,這是 ATTACH 陳述式中 AS 關鍵字後出現的名稱。對於主資料庫檔案,資料庫名稱為 "main"。對於 TEMP 資料表,資料庫名稱為 "temp"。
如果 flags 參數非零,則 BLOB 會以讀寫存取模式開啟。如果 flags 參數為零,則 BLOB 會以唯讀存取模式開啟。
成功時,會回傳 SQLITE_OK,並將新的 BLOB 控制代碼 儲存在 *ppBlob 中。否則會回傳 錯誤碼,除非錯誤碼為 SQLITE_MISUSE,否則 *ppBlob 會設為 NULL。這表示,只要 API 沒有被誤用,在此函式回傳後,呼叫 *ppBlob 上的 sqlite3_blob_close() 一定是安全的。
如果符合以下任何條件,此函式會以 SQLITE_ERROR 失敗:
除非回傳 SQLITE_MISUSE,否則此函式會設定可透過 sqlite3_errcode() 和 sqlite3_errmsg() 以及相關函式存取的 資料庫連線 錯誤碼和訊息。
可以使用 sqlite3_blob_read() 介面讀取 sqlite3_blob_open() 參考的 BLOB,並使用 sqlite3_blob_write() 修改。可以使用 sqlite3_blob_reopen() 介面將 BLOB 控制代碼 移動到同一表格的不同列。但是,在開啟 BLOB 控制代碼 後,無法變更其欄位、表格或資料庫。
如果 BLOB 控制代碼 指向的列被 UPDATE、DELETE 或 ON CONFLICT 副作用修改,則該控制代碼會被標記為「過期」。即使變更的欄位不是 BLOB 控制代碼開啟的欄位,只要該列的任何欄位被變更,此情況就會成立。對過期的 BLOB 控制代碼呼叫 sqlite3_blob_read() 和 sqlite3_blob_write() 會失敗,並回傳 SQLITE_ABORT。在 BLOB 過期之前寫入 BLOB 的變更不會因為 BLOB 過期而回滾。如果交易繼續完成,這些變更最終將會被提交。
使用 sqlite3_blob_bytes() 介面來決定已開啟 BLOB 的大小。此介面無法變更 BLOB 的大小。使用 UPDATE SQL 指令來變更 BLOB 的大小。
sqlite3_bind_zeroblob() 和 sqlite3_result_zeroblob() 介面以及內建的 zeroblob SQL 函式可用於建立零填充的 BLOB,以便使用增量 BLOB 介面進行讀寫。
為了避免資源洩漏,每個開啟的 BLOB 控制代碼 (BLOB handle) 最終都應該透過呼叫 sqlite3_blob_close() 來釋放。
另請參閱:sqlite3_blob_close()、sqlite3_blob_reopen()、sqlite3_blob_read()、sqlite3_blob_bytes()、sqlite3_blob_write()。
另請參閱 物件 (Objects)、常數 (Constants) 和 函式 (Functions) 列表。