Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere 外部函数 API

 

处理数据类型

数据类型

以下 SQL 数据类型可传递给外部库:

SQL 数据类型 sqldef.h C 类型
CHAR DT_FIXCHAR 具有指定长度的字符数据
VARCHAR DT_VARCHAR 具有指定长度的字符数据
LONG VARCHAR、TEXT DT_LONGVARCHAR 具有指定长度的字符数据
UNIQUEIDENTIFIERSTR DT_FIXCHAR 具有指定长度的字符数据
XML DT_LONGVARCHAR 具有指定长度的字符数据
NCHAR DT_NFIXCHAR UTF-8 字符数据,具有指定长度
NVARCHAR DT_NVARCHAR UTF-8 字符数据,具有指定长度
LONG NVARCHAR、NTEXT DT_LONGNVARCHAR UTF-8 字符数据,具有指定长度
UNIQUEIDENTIFIER DT_BINARY 二进制数据,长度为 16 字节
BINARY DT_BINARY 具有指定长度的二进制数据
VARBINARY DT_BINARY 具有指定长度的二进制数据
LONG BINARY DT_LONGBINARY 具有指定长度的二进制数据
TINYINT DT_TINYINT 1 字节整数
[ UNSIGNED ] SMALLINT DT_SMALLINT、DT_UNSMALLINT [ 无符号的 ] 2 字节整数
[ UNSIGNED ] INT DT_INT、DT_UNSINT [ 无符号的 ] 4 字节整数
[ UNSIGNED ] BIGINT DT_BIGINT、DT_UNSBIGINT [ 无符号的 ] 8 字节整数
REAL、FLOAT(1-24) DT_FLOAT 单精度浮点数
DOUBLE、FLOAT(25-53) DT_DOUBLE 双精度浮点数

不能使用任何日期或时间数据类型,也不能使用 DECIMAL 或 NUMERIC 数据类型(包括货币类型)。

要为 INOUT 或 OUT 参数提供值,请使用 set_value API 函数。要读取 IN 和 INOUT 参数,请使用 get_value API 函数。

确定参数的数据类型

调用 get_value 之后,an_extfn_value 结构的类型字段可用于获取参数的数据类型信息。以下示例代码段显示了如何标识参数的类型。

an_extfn_value      arg;
a_sql_data_type     data_type;

extapi->get_value( arg_handle, 1, &arg );
data_type = arg.type & DT_TYPES;
switch( data_type ) 
{
case DT_FIXCHAR:
case DT_VARCHAR:
case DT_LONGVARCHAR:
    break;
default:
    return;
}

有关数据类型的详细信息,请参见使用主机变量

UTF-8 类型

NCHAR、NVARCHAR、LONG NVARCHAR 和 NTEXT 等 UTF-8 数据类型都作为 UTF-8 编码字符串传递。Windows MultiByteToWideChar 等函数可用来将 UTF-8 字符串转换为宽字符 (Unicode) 字符串。

传递 NULL

对于所有参数,您都可以将 NULL 作为有效值传递。外部库中的函数可以提供 NULL 作为任何数据类型的返回值。

返回值

要设置外部函数中的返回值,请以值为 0 的 arg_num 参数调用 set_value 函数。如果不使用设置为 0 的 arg_num 调用 set_value,则该函数的结果为 NULL。

为调用存储函数设置返回值的数据类型同样非常重要。以下代码段显示了如何设置返回数据类型。

an_extfn_value      retval;

retval.type = DT_LONGVARCHAR;
retval.data = result;
retval.piece_len = retval.len.total_len = (a_sql_uint32) strlen( result );
extapi->set_value( arg_handle, 0, &retval, 0 );