プログラムとデータベースサーバー間で情報を転送するには、それぞれのデータ項目についてデータ型を設定します。ホスト変数は、サポートされる任意のデータ型について作成できます。
ホスト変数として使用できる 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; |
プリプロセッサーは宣言セクション内のこれらのマクロを認識し、変数を適切な型として処理します。
次のデータ型が、Embedded SQL プログラミングインターフェイスでサポートされます。
short int I; unsigned short int I; |
long int l; unsigned long int l; |
float f; |
double d; |
DECL_DECIMAL(p,s) typedef struct TYPE_DECIMAL { char array[1]; } TYPE_DECIMAL; |
char a[n]; /* n > 1 */ char *a; /* n = 2049 */ |
SQL プリプロセッサーでは、「char のポインター」は 2049 バイトの文字配列を指しており、この文字配列が 2048 文字と NULL ターミネーターを十分に保持できるとみなされます。つまり、char* データ型は、CHAR(2048) SQL 型にマッピングされます。この制限を超えると、アプリケーションによるメモリ破損が発生する場合があります。
16 ビットコンパイラーの場合、単純に 2049 バイトを確保するとプログラムのスタックオーバーフローを引き起こすこともあります。この問題を避けるため、宣言した配列を必要に応じて関数のパラメーターとして使用し、SQL プリプロセッサーに配列のサイズを通知するようにしてください。WCHAR と TCHAR も char と同じように機能します。
NULL で終了された Unicode 、またはワイド文字列 文字ごとに 2 バイトの領域を占有するため、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 */ |
2 バイトの長さフィールドを持つ可変長文字列 データベースサーバーに情報を渡す場合は、長さフィールドを設定します。データベースサーバーから情報をフェッチする場合は、サーバーが長さフィールドを設定します (埋め込みは行われません)。
DECL_VARCHAR(n) a; /* n >= 1 */ typedef struct VARCHAR { a_sql_ulen len; TCHAR array[1]; } VARCHAR; |
2 バイトの長さフィールドを持つ可変長バイナリデータ データベースサーバーに情報を渡す場合は、長さフィールドを設定します。データベースサーバーから情報をフェッチする場合は、サーバーが長さフィールドを設定します。
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 構造体を介してデータベースに日付、時刻、またはタイムスタンプを入力しようとすると、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];\ } |
32 KB を超えるデータには、DECL_LONGVARCHAR 構造体を使用できます。データは、全体を一度にフェッチする方法と、GET DATA 文を使用して分割してフェッチする方法があります。また、サーバーに対しても、全体を一度に送信する方法と、SET 文を使用してデータベース変数に追加することで分割して送信する方法があります。データは、NULL で終了しません。
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]; \ } |
32 KB を超えるデータには、DECL_LONGBINARY 構造体を使用できます。データは、全体を一度にフェッチする方法と、GET DATA 文を使用して分割してフェッチする方法があります。また、サーバーに対しても、全体を一度に送信する方法と、SET 文を使用してデータベース変数に追加することで分割して送信する方法があります。
これらの構造体は %SQLANY12%\SDK\Include\sqlca.h ファイルに定義されています。VARCHAR 型、BINARY 型、TYPE_DECIMAL 型は、データ格納領域が長さ 1 の文字配列のため、ホスト変数の宣言には向いていません。しかし、動的な変数の割り付けや他の変数の型変換を行うのには有効です。
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |