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

SQL Anywhere 12.0.1 (Deutsch) » UltraLite - C- und C++-Programmierung » Anwendungsentwicklung » UltraLite C++-Anwendungsentwicklung mit Embedded SQL » Hostvariablen

 

Datentypen

Um Informationen zwischen einem Programm und dem Datenbankserver austauschen zu können, müssen alle Datenelemente einen Datentyp haben. Eine Hostvariable kann jeden der unterstützten Datentypen haben.

Nur eine begrenzte Anzahl von C-Datentypen werden als Hostvariablen unterstützt. Andererseits haben bestimmte Hostvariablen keinen entsprechenden Datentyp in C.

Mit Makros, die in der Header-Datei sqlca.h festgelegt sind, können Sie eine Hostvariable vom Typ VARCHAR, FIXCHAR, BINARY, DECIMAL oder SQLDATETIME deklarieren. Diese Makros werden wie folgt benutzt:

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;

Der Präprozessor erkennt diese Makros innerhalb eines Deklarationsabschnitts und behandelt Variablen ihrem Typ entsprechend.

Folgende Datentypen werden von der Embedded SQL-Programmierschnittstelle unterstützt:

  • 16-Bit-Ganzzahl mit Vorzeichen  
    short int I;
    unsigned short int I;

  • 32-Bit-Ganzzahl mit Vorzeichen  
    long int l;
    unsigned long int l;

  • 4-Byte-Gleitkommazahl  
    float f;

  • 8-Byte-Gleitkommazahl  
    double d;

  • Gepackte Dezimalzahl  
    DECL_DECIMAL(p,s)
    typedef struct TYPE_DECIMAL {
       char array[1];
    } TYPE_DECIMAL;

  • Zeichenfolge mit Nullabschlusszeichen, mit Leerzeichen aufgefüllt  
    char a[n]; /* n > 1 */
    char *a; /* n = 2049 */
    Da das Array der Programmiersprache C auch das Nullabschlusszeichen enthalten muss, wird der Datentyp char a[] dem SQL-Datentyp CHAR(n - 1) zugeordnet, der n-1 Zeichen speichern kann.

    -Hinweis

    Der SQL-Präprozessor geht davon aus, dass ein Zeiger auf char auf ein Zeichen-Array von 2049 Byte zeigt und dass dieses Array 2048 Zeichen plus dem Nullabschlusszeichen problemlos speichern kann. Das heißt, der Datentyp "char*" wird auf den SQL-Typ "CHAR(2048)" abgebildet. Ist das nicht der Fall, beschädigt Ihre Anwendung möglicherweise den Speicher.

    Falls Sie einen 16-Bit-Compiler verwenden, können die erforderlichen 2049 Byte einen Überlauf des Programm-Stacks verursachen. Verwenden Sie stattdessen ein deklariertes Array, auch als Parameter einer Funktion, um dem SQL-Präprozessor die Größe des Arrays mitzuteilen. WCHAR und TCHAR verhalten sich ähnlich wie "char".

  • Mit einem Nullabschlusszeichen endende UNICODE- oder breite Zeichenfolge   Jedes Zeichen belegt zwei Byte Platz und kann daher UNICODE-Zeichen enthalten.
    WCHAR a[n]; /* n > 1 */

  • Mit einem Nullabschlusszeichen endende systemabhängige Zeichenfolge   TCHAR entspricht WCHAR für Systeme, die UNICODE als Zeichensatz verwenden (beispielsweise Windows Mobile). Andernfalls entspricht TCHAR dem Datentyp char. Der TCHAR-Datentyp unterstützt Zeichenfolgen in jedem System automatisch.
    TCHAR a[n]; /* n > 1 */

  • Zeichenfolge fester Länge, mit Leerzeichen aufgefüllt  
    char a; /* n  = 1 */
    DECL_FIXCHAR(n) a; /* n >= 1 */

  • Zeichenfolge variabler Länge mit 2-Byte-Längenfeld   Wenn Sie dem Datenbankserver Informationen liefern, müssen Sie das Längenfeld setzen. Wenn Sie Informationen vom Datenbankserver abholen, setzt der Datenbankserver das Längenfeld (nicht aufgefüllt).
    DECL_VARCHAR(n) a; /* n >= 1 */
    typedef struct VARCHAR {
       a_sql_ulen len;
       TCHAR array[1];
    } VARCHAR;

  • Binärdaten variabler Länge mit 2-Byte-Längenfeld   Wenn Sie dem Datenbankserver Informationen liefern, müssen Sie das Längenfeld setzen. Wenn Sie Informationen vom Datenbankserver abrufen, setzt der Datenbankserver das Längenfeld.
    DECL_BINARY(n) a; /* n >= 1 */
    typedef struct BINARY {
      a_sql_ulen len;
       unsigned char array[1];
    } BINARY;

  • SQLDATETIME-Struktur mit Feldern für jeden Teil eines Zeitstempels  


    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;
    Die Struktur SQLDATETIME wird verwendet, um Felder vom Typ DATE, TIME und TIMESTAMP abzurufen (oder einen beliebigen Datentyp, der in einen dieser Datentypen konvertiert werden kann). Anwendungen haben häufig eigene Formate und einen eigenen Programmcode für Zeit und Datum. Das Abrufen von Daten in diese Struktur vereinfacht die Datenbearbeitung für Sie. Beachten Sie, dass Felder vom Typ DATE, TIME und TIMESTAMP auch mit einem beliebigen Zeichendatentyp abgerufen und aktualisiert werden können.

    Wenn Sie eine SQLDATETIME-Struktur verwenden, um ein Datum, eine Zeit oder einen Zeitstempel in die Datenbank einzugeben, werden die Felder day_of_year und day_of_week ignoriert.

  • DT_LONGVARCHAR   Lange Zeichendaten mit unterschiedlicher Länge. Der Makro definiert wie folgt eine Struktur:
    #define DECL_LONGVARCHAR( size ) \
      struct { a_sql_uint32    array_len;    \
               a_sql_uint32    stored_len;   \
               a_sql_uint32    untrunc_len;  \
               char            array[size+1];\
             }

    Die DECL_LONGVARCHAR-Struktur kann mit Daten über 32 kB verwendet werden. Daten können auf einmal oder mithilfe der Anweisung GET DATA in Abschnitten abgerufen werden. Sie können an den Server auf einmal, beziehungsweise in Abschnitten übermittelt werden, indem sie an eine Datenbankvariable mit der SET-Anweisung angehängt werden. Die Daten werden nicht mit einem Nullabschlusszeichen abgeschlossen.

  • DT_LONGBINARY   Lange Binärdaten. Der Makro definiert wie folgt eine Struktur:
    #define DECL_LONGBINARY( size )  \
      struct { a_sql_uint32    array_len;    \
               a_sql_uint32    stored_len;   \
               a_sql_uint32    untrunc_len;  \
               char            array[size];  \
             }

    Die DECL_ LONGBINARY-Struktur kann mit Daten von mehr als 32 kB verwendet werden. Daten können auf einmal oder mithilfe der Anweisung GET DATA in Abschnitten abgerufen werden. Sie können an den Server auf einmal, beziehungsweise in Abschnitten übermittelt werden, indem sie an eine Datenbankvariable mit der SET-Anweisung angehängt werden.

Die Strukturen werden in der Datei %SQLANY12%\SDK\Include\sqlca.h definiert. Die Typen VARCHAR, BINARY und TYPE_DECIMAL enthalten ein Ein-Zeichen-Array und sind nicht für die Deklaration von Hostvariablen zu gebrauchen. Sie sind allerdings nützlich, um Variablen dynamisch zuzuweisen oder andere Variablen umzuwandeln ("Typecasting").

 Datenbank-Datentypen DATE und TIME
 Siehe auch