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 Hostvariable unterstützt. Andererseits haben bestimmte Hostvariable 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 Variable 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; |
float f; |
double d; |
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 -1 Zeichen speichern kann.
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 { unsigned short int 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 abholen, setzt der Datenbankserver das Längenfeld.
DECL_BINARY(n) a; /* n >= 1 */ typedef struct BINARY { unsigned short int 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. Der Abruf von Daten in dieser Struktur erleichtert dem Programmierer den Umgang damit. 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.
Weitere Hinweise zu den Datenbankoptionen date_format, time_format, timestamp_format und date_order finden Sie unter Datenbankoptionen.
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 KByte 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.
typedef struct BINARY { unsigned short int len; char array[1]; } BINARY; |
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 KByte 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 sind in der Datei Installationsverzeichnis\SDK\Include\sqlca.h festgelegt. 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 Variable dynamisch zuzuweisen oder andere Variable umzuwandeln ("Typecasting").
Die Embedded SQL-Schnittstelle bietet keine Datentypen, die den verschiedenen Datenbank-Datentypen von DATE und TIME entsprechen. Diese Datenbank-Datentypen werden entweder mit der Struktur SQLDATETIME oder mit Zeichenfolgen abgerufen und aktualisiert.
Es gibt in der Embedded SQL-Schnittstelle keine Datentypen für LONG VARCHAR und LONG BINARY.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |