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() 修改 BLOB。可以使用sqlite3_blob_reopen() 接口将BLOB 句柄移动到同一表中的不同行。但是,在打开BLOB 句柄之后,无法更改BLOB 句柄的列、表或数据库。
如果UPDATE、DELETE 或ON CONFLICT 副作用修改了 BLOB 句柄指向的行,则该 BLOB 句柄将被标记为“已过期”。如果行的任何列发生更改,即使是 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 句柄最终都应该通过调用sqlite3_blob_close() 来释放。
另请参阅:sqlite3_blob_close()、sqlite3_blob_reopen()、sqlite3_blob_read()、sqlite3_blob_bytes()、sqlite3_blob_write()。