勇芳软件工作室.汉化:  SQLite3 API Functions > Statements >

sqlite3_column_bytes

Previous pageReturn to chapter overviewNext page

描述

 

返回列值的字节数。

 

C / C ++语法

 

int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

 

PB语法

 

FUNCTION sqlite3_column_bytes ( _

BYVAL hStmt AS DWORD, _

BYVAL nCol AS LONG _

) AS LONG

 

参数

 

pStmt

 

[in]语句句柄。

 

nCol

 

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

 

返回值

 

列值的字节数。

 

备注

 

如果SQL语句当前没有指向有效的行,或者如果列索引超出范围,则结果是未定义的。这些函数只能在最近调用sqlite3_step已返回SQLITE_ROW时调用,并且之后不再调用sqlite3_resetsqlite3_finalize.如果在sqlite3_resetsqlite3_finalize之后或在sqlite3_step返回了除了SQLITE_ROW之外的某些功能之后调用了这些功能,则结果未定义。sqlite3_resetsqlite3_resetsqlite3_finalizesqlite3_column_bytes待处理之前从另一个线程调用,则结果未定义。

 

如果结果是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返回零。

 

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

 

请注意,当发生类型转换时,先前调用sqlite3_column_blobsqlite3_column_text和/或sqlite3_column_text16返回的指针可能无效。

 

如果初始内容是UTF-16文本,并且sqlite3_column_bytes被调用,则内容被转换为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_textsqlite3_column_blobsqlite3_column_text16以强制结果为所需的格式,然后调用sqlite3_column_bytessqlite3_column_bytes16查找结果的大小。不要拨打sqlite3_column_textsqlite3_column_blobsqlite3_column_bytes16的来电,并且不要将来电sqlite3_column_text16sqlite3_column_bytes联系。

 

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

 

如果在评估任何这些功能时发生内存分配错误,则返回默认值。默认值为0。对sqlite3_errcode的后续调用将返回SQLITE_NOMEM。

 

C ++实现代码

 

SQLITE_API int sqlite3_column_bytes(sqlite3_stmt *pStmt, int i){

int val = sqlite3_value_bytes( columnMem(pStmt,i) );

columnMallocFailure(pStmt);

return val;

}