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 → 真实价值 sqlite3_value_int → 32位整数值 sqlite3_value_int64 → 64位整数值 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中该列未更改,则为True。 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字符串为big-endian和little-endian。
如果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)接口返回true当且仅当相应于X的列是由更新操作,所述的XUpdate方法调用被调用来实现和保持不变,如果和现有xColumn方法调用被调用以提取返回的该列的值而未设置结果(可能是因为它查询了sqlite3_vtab_nochange()并发现该列未更改)。在xUpdate方法中,在所有其他方面,sqlite3_value_nochange(X)为true的任何值都将显示为NULL值。如果在xUpdate以外的任何地方调用sqlite3_value_nochange(X) 方法调用UPDATE语句,则返回值是任意的且无意义。
如果值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值的返回值相同。通过在获得可疑返回值之后并且在同一数据库连接上调用任何其他SQLite接口之前立即调用sqlite3_errcode(),可以将有效的SQL NULL返回与内存不足错误区分开。