要在程序和数据库服务器间传输信息,每个数据项都必须有一个数据类型。可使用任何一种受支持的类型创建主机变量。
仅有有限数量的 C 数据类型可作为主机变量。而且,某些主机变量类型没有对应的 C 类型。
在头文件 sqlca.h 中定义的宏可用于声明 VARCHAR、FIXCHAR、BINARY、DECIMAL 或 SQLDATETIME 类型的主机变量。这些宏的用法如下:
EXEC SQL BEGIN DECLARE SECTION; DECL_VARCHAR( 10 ) v_varchar; DECL_FIXCHAR( 10 ) v_fixchar; DECL_BINARY( 4000 ) v_binary; DECL_DECIMAL( 10, 2 ) v_packed_decimal; DECL_DATETIME v_datetime; EXEC SQL END DECLARE SECTION; |
预处理器能够识别声明部分中的这些宏,并可将变量视为相应的类型。
以下数据类型受嵌入式 SQL 编程接口的支持:
short int I; unsigned short int I; |
long int l; unsigned long int l; |
float f; |
double d; |
DECL_DECIMAL(p,s) typedef struct TYPE_DECIMAL { char array[1]; } TYPE_DECIMAL; |
char a[n]; /* n > 1 */ char *a; /* n = 2049 */ |
SQL 预处理器假定字符指针指向一个大小为 2049 字节的字符数组,此数组可安全地保存 2048 个字符以及 NULL 终止符。换句话说,将 char* 数据类型映射为 CHAR(2048) SQL 类型。如果不是这样,则应用程序可能会发生内存出错。
如果使用的是 16 位编译器,则要求 2049 个字节可能会使程序堆栈溢出。这时,可改用已声明数组(即使是作为函数的一个参数),以使 SQL 预处理器知道该数组的大小。WCHAR 和 TCHAR 的行为与 char 类似。
以 NULL 终止的 UNICODE 或宽字符字符串 每个字符占用两个字节的空间,所以可能包含 UNICODE 字符。
WCHAR a[n]; /* n > 1 */ |
以 NULL 终止的、依赖于系统的字符串 对于使用 UNICODE 作为其字符集的系统(例如 Windows Mobile)而言,TCHAR 等效于 WCHAR;否则,TCHAR 等效于 char。TCHAR 数据类型设计为自动支持这两种系统中的字符串。
TCHAR a[n]; /* n > 1 */ |
char a; /* n = 1 */ DECL_FIXCHAR(n) a; /* n >= 1 */ |
带有两字节长度字段的可变长度字符串 在向数据库服务器提供信息时,您必须设置长度字段。从数据库服务器读取信息时,服务器将设置长度字段(不填充空白)。
DECL_VARCHAR(n) a; /* n >= 1 */ typedef struct VARCHAR { a_sql_ulen len; TCHAR array[1]; } VARCHAR; |
带有两字节长度字段的可变长度二进制数据 在向数据库服务器提供信息时,您必须设置长度字段。在从数据库服务器读取信息时,服务器将设置长度字段。
DECL_BINARY(n) a; /* n >= 1 */ typedef struct BINARY { a_sql_ulen len; unsigned char array[1]; } BINARY; |
SQLDATETIME 结构,对于时间戳的每一部分都有一个字段
DECL_DATETIME a; typedef struct SQLDATETIME { unsigned short year; /* for example: 1999 */ unsigned char month; /* 0-11 */ unsigned char day_of_week; /* 0-6, 0 = Sunday */ unsigned short day_of_year; /* 0-365 */ unsigned char day; /* 1-31 */ unsigned char hour; /* 0-23 */ unsigned char minute; /* 0-59 */ unsigned char second; /* 0-59 */ unsigned long microsecond; /* 0-999999 */ } SQLDATETIME; |
如果您使用 SQLDATETIME 结构将日期、时间或时间戳输入到数据库中,则会忽略 day_of_year 和 day_of_week 成员。
DT_LONGVARCHAR 可变长度长整型字符数据。该宏定义一个如下结构:
#define DECL_LONGVARCHAR( size ) \ struct { a_sql_uint32 array_len; \ a_sql_uint32 stored_len; \ a_sql_uint32 untrunc_len; \ char array[size+1];\ } |
DECL_LONGVARCHAR 结构可用于表示大于 32KB 的数据。可以一次读取全部数据,也可以使用 GET DATA 语句逐段读取。可以将全部数据一次提供给服务器,也可以通过使用 SET 语句附加到数据库变量中来逐段提供。该数据不是以空值终止的。
DT_LONGBINARY 长二进制数据。该宏定义一个如下结构:
#define DECL_LONGBINARY( size ) \ struct { a_sql_uint32 array_len; \ a_sql_uint32 stored_len; \ a_sql_uint32 untrunc_len; \ char array[size]; \ } |
DECL_LONGBINARY 结构可用于表示大于 32KB 的数据。可以一次读取全部数据,也可以使用 GET DATA 语句逐段读取。可以将全部数据一次提供给服务器,也可以通过使用 SET 语句附加到数据库变量中来逐段提供。
这些结构在 %SQLANY12%\SDK\Include\sqlca.h 文件中定义。VARCHAR、BINARY 和 TYPE_DECIMAL 类型包含一个单字符数组,它们对于声明主机变量没有帮助。但是,它们对于动态分配变量或强制转换其它变量的类型十分有用。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |