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_blob → BLOB 值 sqlite3_value_double → REAL 值 sqlite3_value_int → 32 位 INTEGER 值 sqlite3_value_int64 → 64 位 INTEGER 值 sqlite3_value_pointer → 指针值 sqlite3_value_text → UTF-8 TEXT 值 sqlite3_value_text16 → 以本地字节序表示的 UTF-16 TEXT 值 sqlite3_value_text16be → UTF-16be TEXT 值 sqlite3_value_text16le → UTF-16le TEXT 值 sqlite3_value_bytes → BLOB 或 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_INTEGER、SQLITE_FLOAT、SQLITE_TEXT、SQLITE_BLOB 或 SQLITE_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 返回与内存不足错误区分开来。