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

SQL Anywhere 12.0.1 » UltraLite - C 及 C++ 编程 » 应用程序开发 » 使用嵌入式 SQL 开发 UltraLite C++ 应用程序 » 主机变量

 

数据类型

要在程序和数据库服务器间传输信息,每个数据项都必须有一个数据类型。可使用任何一种受支持的类型创建主机变量。

仅有有限数量的 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 数据库类型
 另请参见