Small. Fast. Reliable.
Choose any three.

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_double真实价值
sqlite3_value_int32位整数值
sqlite3_value_int6464位整数值
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中该列未更改,则为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_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)接口返回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返回与内存不足错误区分开。

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