SQLite C 接口

为增量 I/O 打开一个 BLOB

int sqlite3_blob_open(
  sqlite3*,
  const char *zDb,
  const char *zTable,
  const char *zColumn,
  sqlite3_int64 iRow,
  int flags,
  sqlite3_blob **ppBlob
);

该接口打开位于数据库 zDb 中行 iRow、列 zColumn、表 zTable 中的 BLOB的句柄;换句话说,相同的 BLOB 将由以下人员选择:

SELECT zColumn FROM zDb.zTable WHERE rowid = iRow;

参数 zDb 不是包含数据库的文件名,而是数据库的符号名称。对于附加数据库,这是出现在ATTACH语句中 AS 关键字之后的名称。对于主数据库文件,数据库名称是“main”。对于 TEMP 表,数据库名称是“temp”。

如果标志参数不为零,则打开 BLOB 以进行读写访问。如果标志参数为零,则打开 BLOB 以进行只读访问。

成功时,将返回SQLITE_OK并将新的BLOB 句柄存储在 *ppBlob 中。否则返回一个错误代码,除非错误代码是 SQLITE_MISUSE,*ppBlob 被设置为 NULL。这意味着,只要 API 未被滥用, 在该函数返回后调用 *ppBlob 上的sqlite3_blob_close()总是安全的。

如果以下任一情况为真,此函数将失败并返回 SQLITE_ERROR:

除非返回 SQLITE_MISUSE,否则此函数设置 数据库连接错误代码和消息,可通过 sqlite3_errcode()sqlite3_errmsg()及相关函数访问。

sqlite3_blob_open() 引用的 BLOB 可以使用 sqlite3_blob_read()接口读取并 使用sqlite3_blob_write () 修改。可以使用sqlite3_blob_reopen() 接口BLOB 句柄移动到同一表的不同行。但是,打开BLOB 句柄 后,不能更改BLOB 句柄的列、表或数据库

如果 BLOB 句柄指向的行被 UPDATEDELETEON CONFLICT副作用修改,则 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()

另请参阅 对象常量函数的列表。