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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - Programmierung » SQL Anywhere Datenzugriff-APIs » SQL Anywhere Embedded SQL » Hostvariable verwenden

 

C-Hostvariablentypen

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

In der Header-Datei sqlca.h festgelegte Makros können dazu verwendet werden, Hostvariable folgenden Typs zu definieren: NCHAR, VARCHAR, NVARCHAR, LONGVARCHAR, LONGNVARCHAR, BINARY, LONGBINARY, DECIMAL, FIXCHAR, NFIXCHAR, DATETIME (SQLDATETIME), BIT, BIGINT oder UNSIGNED BIGINT. Sie werden wie folgt benutzt:

EXEC SQL BEGIN DECLARE SECTION;
DECL_NCHAR                 v_nchar[10];
DECL_VARCHAR( 10 )         v_varchar;
DECL_NVARCHAR( 10 )        v_nvarchar;
DECL_LONGVARCHAR( 32768 )  v_longvarchar;
DECL_LONGNVARCHAR( 32768 ) v_longnvarchar;
DECL_BINARY( 4000 )        v_binary;
DECL_LONGBINARY( 128000 )  v_longbinary;
DECL_DECIMAL( 30, 6 )      v_decimal;
DECL_FIXCHAR( 10 )         v_fixchar;
DECL_NFIXCHAR( 10 )        v_nfixchar;
DECL_DATETIME              v_datetime;
DECL_BIT                   v_bit;
DECL_BIGINT                v_bigint;
DECL_UNSIGNED_BIGINT       v_ubigint;
EXEC SQL END DECLARE SECTION;

Der Präprozessor erkennt diese Makros innerhalb eines Deklarationsabschnitts und behandelt Variable ihrem Typ entsprechend. Es wird empfohlen, den Typ DECIMAL (DT_DECIMAL, DECL_DECIMAL) nicht zu verwenden, da das Format von Dezimalzahlen herstellerspezifisch ist.

Die folgende Tabelle zeigt die C-Variablentypen, die als Hostvariable erlaubt sind und die entsprechenden Datentypen der Embedded SQL-Schnittstelle.

C-Datentyp Datentyp der Embedded SQL-Schnittstelle Beschreibung
short              si;
short int          si;
DT_SMALLINT 16-Bit-Ganzzahl mit Vorzeichen
unsigned short int usi;
DT_UNSSMALLINT 16-Bit Ganzzahl ohne Vorzeichen
long              l;
long int          l;
DT_INT 32-Bit-Ganzzahl mit Vorzeichen
unsigned long int ul;
DT_UNSINT 32-Bit Ganzzahl ohne Vorzeichen
DECL_BIGINT       ll;
DT_BIGINT 64-Bit-Ganzzahl mit Vorzeichen
DECL_UNSIGNED_BIGINT ull;
DT_UNSBIGINT 64-Bit-Ganzzahl ohne Vorzeichen.
float f;
DT_FLOAT 4-Byte-Gleitkommazahl
double d;
DT_DOUBLE 8-Byte-Gleitkommazahl
char a[n]; /*n>=1*/
DT_STRING Mit NULL abgeschlossene Zeichenfolge im CHAR-Zeichensatz. Die Zeichenfolge wird mit Leerzeichen aufgefüllt, wenn bei der Initialisierung der Datenbank mit Leerzeichen aufgefüllte Zeichenfolgen verwendet werden. Diese Variable speichert n-1 Byte und das Nullabschlusszeichen.
char *a;
DT_STRING Mit NULL abgeschlossene Zeichenfolge im CHAR-Zeichensatz. Diese Variable zeigt auf einen Bereich, der bis zu 32766 Byte plus das Nullabschlusszeichen speichern kann.
DECL_NCHAR a[n]; /*n>=1*/
DT_NSTRING Mit NULL abgeschlossene Zeichenfolge im NCHAR-Zeichensatz. Die Zeichenfolge wird mit Leerzeichen aufgefüllt, wenn bei der Initialisierung der Datenbank mit Leerzeichen aufgefüllte Zeichenfolgen verwendet werden. Diese Variable speichert n-1 Byte plus das Nullabschlusszeichen.
DECL_NCHAR *a;
DT_NSTRING Mit NULL abgeschlossene Zeichenfolge im NCHAR-Zeichensatz. Diese Variable zeigt auf einen Bereich, der bis zu 32766 Byte plus das Nullabschlusszeichen speichern kann.
DECL_VARCHAR(n) a;
DT_VARCHAR Zeichenfolge variabler Länge im CHAR-Zeichensatz mit einem 2-Byte-Längenfeld. Nicht mit NULL abgeschlossene oder mit Leerzeichen aufgefüllte Zeichenfolge. Der Maximalwert für n ist 32765 (Byte).
DECL_NVARCHAR(n) a;
DT_NVARCHAR Zeichenfolge variabler Länge im NCHAR-Zeichensatz mit einem 2-Byte-Längenfeld. Nicht mit NULL abgeschlossene oder mit Leerzeichen aufgefüllte Zeichenfolge. Der Maximalwert für n ist 32765 (Byte).
DECL_LONGVARCHAR(n) a;
DT_LONGVARCHAR Zeichenfolge variabler Länge im CHAR-Zeichensatz mit drei 4-Byte-Längenfeldern. Nicht mit NULL abgeschlossene oder mit Leerzeichen aufgefüllte Zeichenfolge.
DECL_LONGNVARCHAR(n) a;
DT_LONGNVARCHAR Zeichenfolge variabler Länge im NCHAR-Zeichensatz mit drei 4-Byte-Längenfeldern. Nicht mit NULL abgeschlossene oder mit Leerzeichen aufgefüllte Zeichenfolge.
DECL_BINARY(n) a;
DT_BINARY Zeichenfolge mit variabler Länge mit 2-Byte-Längenfeld. Der Maximalwert für n ist 32765 (Byte).
DECL_LONGBINARY(n) a;
DT_LONGBINARY Lange Binärdaten von variabler Länge mit drei 4-Byte-Längenfeldern.
char            a; /*n=1*/ 
DECL_FIXCHAR(n) a;
DT_FIXCHAR Zeichenfolge von fester Länge in CHAR-Zeichensatz. Mit Leerzeichen aufgefüllt, aber ohne Nullabschlusszeichen. Der Maximalwert für n ist 32767 (Byte).
DECL_NCHAR       a; /*n=1*/
DECL_NFIXCHAR(n) a;
DT_NFIXCHAR Zeichenfolge von fester Länge in NCHAR-Zeichensatz. Mit Leerzeichen aufgefüllt, aber ohne Nullabschlusszeichen. Der Maximalwert für n ist 32767 (Byte).
DECL_DATETIME a;
DT_TIMESTAMP_STRUCT SQLDATETIME-Struktur
Zeichensätze

Für DT_FIXCHAR, DT_STRING, DT_VARCHAR und DT_LONGVARCHAR sind die Zeichendaten im CHAR-Zeichensatz der Anwendung. Dies ist gewöhnlich der Zeichensatz der Umgebungsvariablen der Anwendung. Eine Anwendung kann den CHAR-Zeichensatz mithilfe des Verbindungsparameters CHARSET ändern oder indem sie die Funktion db_change_char_charset aufruft.

Für DT_NFIXCHAR, DT_NSTRING, DT_NVARCHAR und DT_LONGNVARCHAR sind die Daten im NCHAR-Zeichensatz der Anwendung. Standardmäßig ist der NCHAR-Zeichensatz der Anwendung identisch mit dem CHAR-Zeichensatz. Eine Anwendung kann den NCHAR-Zeichensatz ändern, indem sie die Funktion db_change_nchar_charset aufruft.

Weitere Hinweise über Umgebungsvariable und Zeichensätze finden Sie unter Näheres zu Sprachumgebungen.

Weitere Hinweise zum Ändern des CHAR-Zeichensatzes finden Sie unter CharSet-Verbindungsparameter [CS] oder db_change_char_charset-Funktion.

Weitere Hinweise zum Ändern des NCHAR-Zeichensatzes finden Sie unter db_change_nchar_charset-Funktion.

Datenlänge

Unabhängig von den verwendeten CHAR- und NCHAR-Zeichensätzen werden alle Datenlängen in Byte angegeben.

Wenn zwischen dem Server und der Anwendung eine Zeichensatzkonvertierung durchgeführt wird, muss die Anwendung sicherstellen, dass die Puffer ausreichend groß sind, um die konvertierten Daten zu verarbeiten, und zusätzliche GET DATA-Anweisungen ausgeben, wenn Daten gekürzt werden.

Zeiger auf ein Zeichen (pointer to char)

Die Datenbankschnittstelle geht bei einer Hostvariable, die als pointer to char (char *a) deklariert ist, von einer Länge von 32767 Byte aus. Jede Hostvariable vom Typ "pointer to char", mit der Informationen aus der Datenbank abgerufen werden, muss auf einen Puffer zeigen, der groß genug ist, um jeden Wert enthalten zu können, der möglicherweise von der Datenbank zurückkommt.

Dies kann riskant sein, da jemand die Definition der Spalte in der Datenbank ändern könnte, sodass sie größer wird als zu dem Zeitpunkt, zu dem das Programm geschrieben wurde. Dies wiederum könnte zu unvorhersehbaren Speicherbelegungen und daraus resultierenden Problemen führen. Es ist besser ein deklariertes Array zu verwenden, auch als Parameter einer Funktion, der als Zeiger auf Zeichen übergeben wird. Diese Vorgehensweise gestattet es der SQL-Anweisung, die Größe des Arrays zu erkennen.

Gültigkeitsbereich von Hostvariablen

Die Deklaration einer Hostvariablen kann im Allgemeinen überall dort stehen, wo auch eine C-Variablendeklaration stehen könnte. Das gilt auch für den Parameterdeklarationsbereich einer C-Funktion. Die dort deklarierten C-Variable haben ihre normalen Aufgaben (sie stehen innerhalb des Blocks zur Verfügung, in dem sie definiert sind). Da aber der SQL-Präprozessor den C-Code nicht durchsucht, erkennt er keine C-Blöcke.

Für den SQL-Präprozessor sind Hostvariable globale Variable für die Quelldatei. Zwei Hostvariable können nicht den gleichen Namen haben.