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

SQL Anywhere 11.0.1 (日本語) » Ultra Light - C/C++ プログラミング » アプリケーション開発 » Embedded SQL を使用したアプリケーションの開発 » ホスト変数の使用

 

Embedded SQL のデータ型

プログラムとデータベース・サーバ間で情報を転送するには、それぞれのデータ項目についてデータ型を設定します。ホスト変数は、サポートされる任意のデータ型について作成できます。

ホスト変数として使用できる 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 プログラミング・インタフェースでサポートされます。

  • 16 ビット符号付き整数  
    short int I;
    unsigned short int I;

  • 32 ビット符号付き整数  
    long int l;
    unsigned long int l;

  • 4 バイト浮動小数点数  
    float f;

  • 8 バイト浮動小数点数  
    double d;

  • パック 10 進数  
    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 データ型にマッピングされます。SQL データ型は、n–1 文字まで保持できます。

    char へのポインタ、WCHAR、TCHAR

    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 {
       unsigned short int len;
       TCHAR array[1];
    } VARCHAR;

  • 2 バイトの長さフィールドを持つ可変長バイナリ・データ   データベース・サーバに情報を渡す場合は、長さフィールドを設定します。データベース・サーバから情報をフェッチする場合は、サーバが長さフィールドを設定します。
    DECL_BINARY(n) a; /* n >= 1 */
    typedef struct BINARY {
       unsigned short int 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 メンバは無視されます。

    詳細については、データベース・オプションの date_format、time_format、timestamp_format、date_order の各データベース・オプションを参照してください。

  • 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 で終了しません。

    typedef struct BINARY {
      unsigned short int len;
      char array[1];
    } BINARY;

  • 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 文を使用してデータベース変数に追加することで分割して送信する方法があります。

これらの構造体は install-dir\SDK\Include\sqlca.h ファイルに定義されています。VARCHAR 型、BINARY 型、TYPE_DECIMAL 型は、データ格納領域が長さ 1 の文字配列のため、ホスト変数の宣言には向いていません。しかし、動的な変数の割り付けや他の変数の型変換を行うのには有効です。

データベースの DATE 型と TIME 型

データベースのさまざまな DATE 型と TIME 型に対応する、Embedded SQL インタフェースのデータ型はありません。これらの型は、SQLDATETIME 構造体または文字列を使用してフェッチと更新を行います。

データベースの LONG VARCHAR 型と LONG BINARY 型に対応する、Embedded SQL インタフェースのデータ型はありません。