小。快。可靠。
三选一。

SQLite C 接口

获取 SQL 值

const void *sqlite3_value_blob(sqlite3_value*);
double sqlite3_value_double(sqlite3_value*);
int sqlite3_value_int(sqlite3_value*);
sqlite3_int64 sqlite3_value_int64(sqlite3_value*);
void *sqlite3_value_pointer(sqlite3_value*, const char*);
const unsigned char *sqlite3_value_text(sqlite3_value*);
const void *sqlite3_value_text16(sqlite3_value*);
const void *sqlite3_value_text16le(sqlite3_value*);
const void *sqlite3_value_text16be(sqlite3_value*);
int sqlite3_value_bytes(sqlite3_value*);
int sqlite3_value_bytes16(sqlite3_value*);
int sqlite3_value_type(sqlite3_value*);
int sqlite3_value_numeric_type(sqlite3_value*);
int sqlite3_value_nochange(sqlite3_value*);
int sqlite3_value_frombind(sqlite3_value*);

摘要

sqlite3_value_blobBLOB 值
sqlite3_value_doubleREAL 值
sqlite3_value_int32 位 INTEGER 值
sqlite3_value_int6464 位 INTEGER 值
sqlite3_value_pointer指针值
sqlite3_value_textUTF-8 TEXT 值
sqlite3_value_text16以本地字节序表示的 UTF-16 TEXT 值
sqlite3_value_text16beUTF-16be TEXT 值
sqlite3_value_text16leUTF-16le TEXT 值
   
sqlite3_value_bytesBLOB 或 UTF-8 TEXT 的大小(以字节为单位)
sqlite3_value_bytes16   →  UTF-16 TEXT 的大小(以字节为单位)
sqlite3_value_type值的默认数据类型
sqlite3_value_numeric_type   →  值的最佳数字数据类型
sqlite3_value_nochange   →  如果列在针对虚拟表的 UPDATE 中未更改,则为真。
sqlite3_value_frombind   →  如果值源自 绑定参数,则为真

详情

这些例程从 受保护的 sqlite3_value 对象中提取类型、大小和内容信息。受保护的 sqlite3_value 对象用于将参数信息传递给实现 应用程序定义的 SQL 函数虚拟表 的函数。

这些例程仅适用于 受保护的 sqlite3_value 对象。任何尝试对 不受保护的 sqlite3_value 使用这些例程都是线程不安全的。

这些例程的工作原理与相应的 列访问函数 相同,只是这些例程接受单个 受保护的 sqlite3_value 对象指针,而不是 sqlite3_stmt* 指针和整数列号。

sqlite3_value_text16() 接口以主机机的本地字节序提取 UTF-16 字符串。sqlite3_value_text16be() 和 sqlite3_value_text16le() 接口分别以大端和小端提取 UTF-16 字符串。

如果 sqlite3_value 对象 V 使用 sqlite3_bind_pointer(S,I,P,X,D)sqlite3_result_pointer(C,P,X,D) 初始化,并且如果 X 和 Y 是根据 strcmp(X,Y) 相等的字符串,则 sqlite3_value_pointer(V,Y) 将返回指针 P。否则,sqlite3_value_pointer(V,Y) 返回 NULL。sqlite3_bind_pointer() 例程是为 SQLite 3.20.0 添加的 指针传递接口 的一部分。

sqlite3_value_type(V) 接口返回 数据类型代码,用于 sqlite3_value 对象 V 的初始数据类型。返回值是以下之一:SQLITE_INTEGERSQLITE_FLOATSQLITE_TEXTSQLITE_BLOBSQLITE_NULL。其他接口可能会更改 sqlite3_value 对象的数据类型。例如,如果数据类型最初是 SQLITE_INTEGER,并且调用 sqlite3_value_text(V) 来提取该整数的文本值,则后续调用 sqlite3_value_type(V) 可能会返回 SQLITE_TEXT。是否发生持久内部数据类型转换是未定义的,并且可能在 SQLite 的一个版本到下一个版本之间发生变化。

sqlite3_value_numeric_type() 接口尝试对值应用数字亲和性。这意味着将尝试将值转换为整数或浮点数。如果这种转换在不丢失信息的情况下是可能的(换句话说,如果该值是一个看起来像数字的字符串),则执行转换。否则不进行转换。返回转换后的 数据类型

虚拟表xUpdate 方法中,sqlite3_value_nochange(X) 接口仅当与 X 对应的列在 xUpdate 方法调用被调用以实现的 UPDATE 操作中未更改,并且先前被调用以提取该列的值的 xColumn 方法调用在未设置结果的情况下返回(可能是因为它查询了 sqlite3_vtab_nochange() 并发现该列没有改变)时返回真。在 xUpdate 方法中,任何 sqlite3_value_nochange(X) 为真的值在所有其他方面看起来都像 NULL 值。如果 sqlite3_value_nochange(X) 在 UPDATE 语句的 xUpdate 方法调用以外的任何地方被调用,则返回值是任意的且毫无意义。

如果值 X 来自 sqlite3_bind() 接口之一,则 sqlite3_value_frombind(X) 接口返回非零值。如果 X 来自 SQL 文字值、表列或表达式,则 sqlite3_value_frombind(X) 返回零。

请特别注意,sqlite3_value_blob()sqlite3_value_text()sqlite3_value_text16() 返回的指针可能会被后续调用 sqlite3_value_bytes()sqlite3_value_bytes16()sqlite3_value_text()sqlite3_value_text16() 撤销。

这些例程必须从与提供 sqlite3_value* 参数的 SQL 函数相同的线程中调用。

只要输入参数正确,这些例程只有在格式转换期间发生内存不足错误时才会失败。只有以下子集接口会受到内存不足错误的影响

如果发生内存不足错误,则这些例程的返回值与该列包含 SQL NULL 值时的返回值相同。可以通过在获取可疑返回值后立即调用 sqlite3_errcode() 并在对同一 数据库连接 调用任何其他 SQLite 接口之前,将有效的 SQL NULL 返回与内存不足错误区分开来。

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