勇芳软件工作室.汉化:  CSQLite Classes > CSQLiteStatement Class > ISQLiteStatement Interface >

ColumnType Method

Previous pageReturn to chapter overviewNext page

描述

 

返回列类型

 

PB语法

 

METHOD ColumnType (BYVAL vCol AS LONG) AS LONG

 

参数

 

vCol

 

[in]应返回信息的列的索引或名称。结果集的最左列有索引0。结果中的列数可以使用ColumnCount确定。

 

返回值

 

列类型。

 

备注

 

如果SQL语句当前没有指向有效的行,或者如果列索引超出范围,则结果是未定义的。只有当最近调用已经返回SQLITE_ROW并且以后不再调用重启最终确定时才可以调用这些函数。如果在重启最终确定之后或在返回了除了SQLITE_ROW之外的任何东西之后调用了这些函数中的任何一个,则结果未定义。重启最终确定ColumnType待处理之前从另一个线程调用,则结果未定义。

 

ColumnType函数返回结果列的初始数据类型的数据类型代码。返回的值是SQLITE_INTEGER,SQLITE_FLOAT,SQLITE_TEXT,SQLITE_BLOB或SQLITE_NULL之一。ColumnType返回的值仅在没有发生类型转换时才有意义,如下所述。类型转换后,ColumnType返回的值未定义。SQLite的未来版本可能会改变类型转换后ColumnType的行为。

 

如果结果是BLOB或UTF-8字符串,则ColumnBytes函数返回该BLOB或字符串中的字节数。如果结果是UTF-16字符串,则ColumnBytes将字符串转换为UTF-8,然后返回字节数。如果结果是数值,则ColumnBytes使用的snprintf将该值转换为UTF-8字符串,并返回该字符串中的字节数。如果结果为NULL,则ColumnBytes返回零。

 

如果结果是BLOB或UTF-16字符串,则ColumnBytesW函数返回该BLOB或字符串中的字节数。如果结果是UTF-8字符串,则ColumnBytesW将字符串转换为UTF-16,然后返回字节数。如果结果为数值,则ColumnBytesW将使用的snprintf将该值转换为UTF-16字符串,并返回该字符串中的字节数。如果结果为NULL,则ColumnBytesW返回零。

 

ColumnBytesColumnBytesW返回的值不包括字符串末尾的零终结符。为了清楚起见:ColumnBytesColumnBytesW返回的值是字符串中的字节数,而不是字符数。

 

ColumnTextColumnTextW返回的字符串(即使是空字符串)始终为零终止。零长度BLOB的ColumnBlob的返回值为NULL指针。

 

ColumnValue返回的对象是一个无保护的sqlite3_value对象。不受保护的sqlite3_value对象只能与BindValueResultValue一起使用。如果以ColumnValue返回的未受保护的sqlite3_value对象以任何其他方式使用,包括调用ValueLongValueTextValueBytes等功能,则行为是未定义的。

 

这些函数尝试在适当的时候转换值。例如,如果内部表示为FLOAT并且请求文本结果,则的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程序员熟悉的。

 

请注意,当类型转换发生时,由ColumnBlobColumnText和/或ColumnTextW的先前调用返回的指针可能无效。在以下情况下可能会出现类型转换和指针无效:

 

初始内容是BLOB,ColumnTextColumnTextW被调用。可能需要将零终止符添加到字符串。

 

初始内容为UTF-8文本,ColumnBytesWColumnTextW被调用。内容必须转换为UTF-16。

 

初始内容为UTF-16文本,ColumnBytesColumnText被调用。内容必须转换为UTF-8。

 

UTF-16be和UTF-16le之间的转换总是完成,并且不会使先前的指针无效,尽管先前指针引用的缓冲区的内容当然会被修改。其他类型的转换在可能的情况下进行就位,但有时它们是不可能的,在这些情况下,先前的指针无效。

 

最安全和最简单的记住策略是通过以下方式之一调用这些功能:

 

ColumnText后跟ColumnBytes

ColumnBlob后跟ColumnBytes

ColumnTextW后跟ColumnBytesW

 

换句话说,您应先调用ColumnTextColumnBlobColumnTextW以强制结果为所需的格式,然后调用ColumnBytesColumnBytesW查找结果的大小。不要将来电ColumnText??或ColumnBlobColumnBytesW的电话混合在一??起,不要将来电ColumnTextWColumnBytes联系。

 

返回的指针是有效的,直到类型转换发生如上所述,或直到重启最终确定被调用。用于保存字符串和BLOB的内存空间将自动释放。不要传递返回的指针ColumnBlobColumnText等进入自由.

 

如果在评估任何这些功能时发生内存分配错误,则返回默认值。默认值为整数0,浮点数0.0或空指针。对ErrCode的后续调用将返回SQLITE_NOMEM。