描述
返回列类型
C / C ++语法
int sqlite3_column_type(sqlite3_stmt*, int iCol); |
PB语法
FUNCTION sqlite3_column_type ( _ BYVAL hStmt AS DWORD, _ BYVAL nCol AS LONG _ ) AS LONG |
参数
pStmt
[in]语句句柄。
nCol
[in]应返回信息的列的索引。结果集的最左列有索引0。结果中的列数可以使用sqlite3_column_count确定。
返回值
列类型。
备注
如果SQL语句当前没有指向有效的行,或者如果列索引超出范围,则结果是未定义的。这些函数只能在最近调用sqlite3_step已返回SQLITE_ROW时调用,并且之后不再调用sqlite3_reset或sqlite3_finalize.如果在sqlite3_reset或sqlite3_finalize之后或在sqlite3_step返回了除了SQLITE_ROW之外的某些功能之后调用了这些功能,则结果未定义。sqlite3_step或sqlite3_reset或sqlite3_finalize在sqlite3_column_type待处理之前从另一个线程调用,则结果未定义。
sqlite3_column_type函数返回结果列的初始数据类型的数据类型代码。返回的值是SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB或SQLITE_NULL之一。sqlite3_column_type返回的值仅在没有发生类型转换时才有意义,如下所述。类型转换后,sqlite3_column_type返回的值未定义。SQLite的未来版本可能会改变类型转换后sqlite3_column_type的行为。
如果结果是BLOB或UTF-8字符串,则sqlite3_column_bytes函数返回该BLOB或字符串中的字节数。如果结果为UTF-16字符串,则sqlite3_column_bytes将字符串转换为UTF-8,然后返回字节数。如果结果是数值,则sqlite3_column_bytes使用sqlite3_snprintf将该值转换为UTF-8字符串,并返回该字符串中的字节数。如果结果为NULL,则sqlite3_column_bytes返回零。
如果结果是BLOB或UTF-16字符串,则sqlite3_column_bytes16函数返回该BLOB或字符串中的字节数。如果结果为UTF-8字符串,则sqlite3_column_bytes16将字符串转换为UTF-16,然后返回字节数。如果结果为数值,则sqlite3_column_bytes16使用sqlite3_snprintf将该值转换为UTF-16字符串,并返回该字符串中的字节数。如果结果为NULL,则sqlite3_column_bytes16返回零。
由sqlite3_column_bytes和sqlite3_column_bytes16返回的值不包括字符串末尾的零终结符。为了清楚起见:sqlite3_column_bytes和sqlite3_column_bytes16返回的值是字符串中的字节数,而不是字符数。
sqlite3_column_text和sqlite3_column_text16返回的字符串(即使是空字符串)始终为零终止。对于零长度BLOB,来自sqlite3_column_blob的返回值是NULL指针。
sqlite3_column_value返回的对象是一个不受保护的sqlite3_value对象。不受保护的sqlite3_value对象只能与sqlite3_bind_value和sqlite3_result_value一起使用。如果以sqlite3_column_value返回的未受保护的sqlite3_value对象以任何其他方式使用,包括对sqlite3_value_int,sqlite3_value_text或sqlite3_value_bytes等函数的调用,那么行为是未定义的。
这些函数尝试在适当的时候转换值。例如,如果内部表示为FLOAT,并且请求文本结果,则sqlite3_snprintf在内部用于自动执行转换。下表详细说明了所应用的转化:
内部类型 |
请求类型 |
转变 |
NULL |
INTEGER |
结果为0 |
NULL |
FLOAT |
结果为0.0 |
NULL |
TEXT |
结果是NULL指针 |
NULL |
BLOB |
结果是NULL指针 |
INTEGER |
FLOAT |
从整数转换为浮点数 |
INTEGER |
TEXT |
整数的ASCII渲染 |
INTEGER |
BLOB |
与INTEGER- >TEXT相同 |
FLOAT |
INTEGER |
从浮点数转换为整数 |
FLOAT |
TEXT |
浮点数的ASCII渲染 |
FLOAT |
BLOB |
与FLOAT- >TEXT相同 |
TEXT |
INTEGER |
使用atoi() |
TEXT |
FLOAT |
使用atof() |
TEXT |
BLOB |
不用找了 |
BLOB |
INTEGER |
转换为TEXT然后使用atoi() |
BLOB |
FLOAT |
转换为TEXT然后使用atof() |
BLOB |
TEXT |
如果需要,添加一个零终止符 |
上面的表格参考了标准C库函数atoi()和atof()。SQLite并没有真正使用这些功能。它具有自己的等效内部功能。为了简洁起见,在表中使用了atoi()和atof()名称,因为它们是大多数C程序员熟悉的。
请注意,当类型转换发生时,先前调用sqlite3_column_blob,sqlite3_column_text和/或sqlite3_column_text16返回的指针可能无效。在以下情况下可能会出现类型转换和指针无效:
初始内容是BLOB,sqlite3_column_text或sqlite3_column_text16被调用。可能需要将零终止符添加到字符串。
初始内容为UTF-8文本,sqlite3_column_bytes16或sqlite3_column_text16??被调用。内容必须转换为UTF-16。
初始内容为UTF-16文本,sqlite3_column_bytes或sqlite3_column_text被调用。内容必须转换为UTF-8。
UTF-16be和UTF-16le之间的转换总是完成,并且不会使先前的指针无效,尽管先前指针引用的缓冲区的内容当然会被修改。其他类型的转换在可能的情况下进行就位,但有时它们是不可能的,在这些情况下,先前的指针无效。
最安全和最简单的记住策略是通过以下方式之一调用这些功能:
sqlite3_column_text后跟sqlite3_column_bytes
sqlite3_column_blob后跟sqlite3_column_bytes
sqlite3_column_text16,后跟sqlite3_column_bytes16
换句话说,您应该先调用sqlite3_column_text,sqlite3_column_blob或sqlite3_column_text16以强制结果为所需的格式,然后调用sqlite3_column_bytes或sqlite3_column_bytes16查找结果的大小。不要将来电sqlite3_column_text或sqlite3_column_blob与sqlite3_column_bytes16的来电混合,不得将来电sqlite3_column_text16与sqlite3_column_bytes的电话混合在一??起。
返回的指针是有效的,直到类型转换发生如上所述,或直到sqlite3_step或sqlite3_reset或sqlite3_finalize被调用。用于保存字符串和BLOB的内存空间将自动释放。不要传递返回的指针sqlite3_column_blob,sqlite3_column_text等进入sqlite3_free.
如果在评估任何这些功能时发生内存分配错误,则返回默认值。默认值为整数0,浮点数0.0或空指针。后续调用sqlite3_errcode将返回SQLITE_NOMEM。
C ++实现代码
SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int i){
int iType = sqlite3_value_type( columnMem(pStmt,i) );
columnMallocFailure(pStmt);
return iType;
}