数据类型
要在程序和数据库服务器间传输信息,每个数据项都必须有一个数据类型。可使用任何一种受支持的类型创建主机变量。
仅有有限数量的 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 编程接口的支持:
16 位有符号整数。short int I;
unsigned short int I;
32 位有符号整数。long int l;
unsigned long int l;
4 字节浮点数float f;
8 字节浮点数double d;
压缩十进制数DECL_DECIMAL(p,s)
typedef struct TYPE_DECIMAL {
char array[1];
} TYPE_DECIMAL;
以 NULL 终止并以空白填充的字符串char a[n]; /* n > 1 */
char *a; /* n = 2049 */
因为 C 语言数组还必须保存 NULL 终止符,所以 char a[n] 数据类型映射为 CHAR(n - 1) SQL 数据类型(可保存 -1 个字符)。
注意
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 结构用于检索 DATE、TIME 和 TIMESTAMP 类型(或者可转换为这些类型之一的任意类型)的字段。应用程序常常具有它们自己的格式和日期操作代码。在该结构中读取数据可为操作该数据提供更多方便。注意,您也可以使用任何字符类型来读取和更新
DATE、TIME 和 TIMESTAMP 字段。
如果您使用 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 类型包含一个单字符数组,它们对于声明主机变量没有帮助。但是,它们对于动态分配变量或强制转换其它变量的类型十分有用。
对于各种 DATE 和 TIME 数据库类型,没有相应的嵌入式 SQL 接口数据类型。这些数据库类型可使用 SQLDATETIME 结构或使用字符串来读取和更新。
没有表示 LONG VARCHAR 和 LONG BINARY 数据库类型的嵌入式 SQL 接口数据类型。