C および C++ 組み込み SQL アプリケーションでのグラフィック・データ用の WCHARTYPE プリコンパイラー・オプション

WCHARTYPE プリコンパイラー・オプションを使用して、グラフィック・データにマルチバイト形式とワイド・キャラクター形式のどちらを使用するかを指定することができます。
WCHARTYPE オプションには、次の 2 つの値があります。
CONVERT
Linux® または UNIX オペレーティング・システムで WCHARTYPE CONVERT オプションを選択すると、グラフィック・ホスト変数と データベース・マネージャーの間で文字コードが変換されます。 グラフィック入力ホスト変数の場合、 wcstombs() データが データベース・マネージャーに送信される前に、ANSI C 関数を使用して、文字コードがワイド文字形式からマルチバイト DBCS 文字形式に変換されます。 グラフィック出力ホスト変数の場合、データベース・マネージャーから受信したデータがホスト変数に保管される前に、 ANSI C 関数 mbstowcs() によって、文字コードがマルチバイト DBCS 文字形式からワイド・キャラクター形式に変換されます。

Windows オペレーティング・システムの場合、グラフィック・ホスト変数で変換の失敗が検出された場合、ユーザーは IBM® データ・サーバー・ドライバー構成ファイル (db2dsdriver.cfg) で SkipLocalCPConversionForWcharConvert キーワードを ON に設定して、失敗を回避できます。

WCHARTYPE CONVERT オプションを使用する利点は、データが データベース・マネージャーに送信される前にデータをマルチバイト形式に明示的に変換しなくても、アプリケーションがワイド・キャラクター・ストリング (L リテラル、'wc' ストリング関数など) を処理するための ANSI C メカニズムを使用できることです。 欠点としては、暗黙のうちに変換を実行することによって実行時にアプリケーションのパフォーマンスに影響を及ぼすことがあり、さらにメモリー要件が大きくなる恐れがあることが挙げられます。

WCHARTYPE CONVERT オプションを選択した場合は、 すべてのグラフィック・ホスト変数を、sqldbchar ではなく wchar_t によって宣言してください。

WCHARTYPE CONVERT オプションの動作は必要であるが、アプリケーションをプリコンパイルする必要がない場合 (例えば、 CLI アプリケーション) は、コンパイル時に C プリプロセッサー・マクロ SQL_WCHART_CONVERT を定義します。 これにより、 Db2® ヘッダー・ファイル内の特定の定義で、 sqldbcharの代わりにデータ・タイプ wchar_t が使用されるようになります。

NOCONVERT (デフォルト)
WCHARTYPE NOCONVERT オプションを選択した場合、または WCHARTYPE オプションを指定しなかった場合は、アプリケーションと データベース・マネージャーとの間で暗黙的な文字コード変換は行われません。 グラフィック・ホスト変数のデータは、 データベース・マネージャー との間で、未変更の DBCS 文字として送受信されます。 これにはパフォーマンスの向上という利点がありますが、アプリケーションが wchar_t ホスト変数でワイド文字データを使用しないようにするか、 データベース・マネージャーとのインターフェース時にデータをマルチバイト形式に変換するために wcstombs() 関数および mbstowcs() 関数を明示的に呼び出す必要があるという欠点があります。

WCHARTYPE NOCONVERT オプションを選択した場合は、他の Db2 クライアント/サーバー環境への移植性を最大にするために、すべてのグラフィック・ホスト変数を sqldbchar タイプで宣言してください。

以下のリストに含まれるガイドラインを検討する必要があります。
  • wchar_t または sqldbchar サポートは DBCS データの処理のために使用されるため、 これを使用する場合は DBCS または EUC で使用可能なハードウェアとソフトウェアが必要になる。 このサポートは、 Db2の DBCS 環境でのみ、または UCS-2 データベースに接続された任意のアプリケーション (1 バイト・アプリケーションを含む) で GRAPHIC データを処理する場合にのみ使用できます。
  • DBCS 以外の文字と、DBCS 以外の文字に変換できるワイド・キャラクターは、GRAPHIC ストリング内では使用しない。 GRAPHIC ストリングでは、その値に 2 バイト文字のコード・ポイントのみが含まれているかどうかを確認するための妥当性検査は行われません。 グラフィック・ホスト変数には、 DBCS データ、または WCHARTYPE CONVERT 設定が有効な場合には、 DBCS データに変換されるワイド・キャラクター・データしか含めることができません。 2 バイト文字と 1 バイト文字が混在しているデータは、 文字ホスト変数を使用して保管します。 混合データのホスト変数は、WCHARTYPE オプションの設定の影響を受けません。
  • WCHARTYPE NOCONVERT プリコンパイル・オプションを使用しているアプリケーションでは、 L リテラルがワイド・キャラクター形式なので、L リテラルをグラフィック・ホスト変数と共に使用しない。 L リテラルは、L という接頭部を付けた C 言語のワイド・キャラクター・ストリング・リテラルであり、 データ・タイプは "array of wchar_t" です。 例えば、L"dbcs-string" は L リテラルです。
  • WCHARTYPE CONVERT プリコンパイル・オプションが使用されているアプリケーションでは、L リテラルを使用して wchar_t ホスト変数を初期化できますが、SQL ステートメントでは使用できません。 SQL ステートメントでは、 L リテラルを使用する代わりに WCHARTYPE の設定から独立している GRAPHIC ストリング定数を使用してください。
  • WCHARTYPE オプションの設定は、SQLDA 構造およびホスト変数を使用して データベース・マネージャー との間でやり取りされるグラフィック・データに影響します。 WCHARTYPE CONVERT 設定が有効な場合、 SQLDA を介してアプリケーションから受け取られるグラフィック・データはワイド・キャラクター形式と見なされ、 wcstombs() 関数を暗黙のうちに呼び出して DBCS 形式に変換されます。 同様に、アプリケーションが受け取るグラフィック出力データは、 アプリケーション・ストレージに保管される前にワイド・キャラクター形式に変換されています。
  • 境界域が設定されていないストアード・プロシージャーは、 WCHARTYPE NOCONVERT オプションを用いてプリコンパイルしなければならない。 通常の境界域が設定されたストアード・プロシージャーは CONVERT または NOCONVERT のいずれのオプションを用いてもプリコンパイルすることができますが、 このオプションの指定はストアード・プロシージャーに含まれる SQL ステートメントに操作されるグラフィック・データの形式に影響を及ぼします。 ただしどちらの場合も、SQLDA を介してストアード・プロシージャーに渡されるグラフィック・データはすべて DBCS 形式となります。 同じように、SQLDA を介してストアード・プロシージャーから渡されるデータも DBCS 形式でなければなりません。
  • アプリケーションがデータベース・アプリケーション・リモート・インターフェース (DARI) のインターフェース (sqleproc() API) を介してストアード・プロシージャーを呼び出す場合、入力 SQLDA 内のグラフィック・データはすべて、呼び出しているアプリケーションの WCHARTYPE 設定に関係なく、DBCS 形式でなければならない。または UCS-2 データベースに接続されている場合は、UCS-2 でなければならない。 同じく、 出力 SQLDA 内のグラフィック・データはすべて、WCHARTYPE 設定に関係なく、 DBCS 形式、または UCS-2 データベースに接続されている場合は UCS-2 形式で戻されます。
  • アプリケーションが SQL CALL ステートメントを介してストアード・プロシージャーを呼び出す場合は、 呼び出しているアプリケーションの WCHARTYPE 設定に従って、SQLDA でグラフィック・データが変換される。
  • ユーザー定義関数 (UDF) に渡されるグラフィック・データは、常に DBCS 形式である。 同じように、UDF から戻されるグラフィック・データもすべて、 DBCS データベースでは DBCS 形式、EUC および UCS-2 データベースでは UCS-2 形式と見なされます。
  • DBCLOB ファイル参照変数を使用して DBCLOB ファイルに保管されるデータは、 DBCS 形式か、または UCS-2 データベースの場合には、UCS-2 形式で保管される。 同様に、DBCLOB ファイルからの入力データは、 DBCS 形式か、または UCS-2 データベースの場合には UCS-2 形式のいずれかで検索されます。
注:
  1. Db2 for Windows オペレーティング・システムの場合、 WCHARTYPE CONVERT オプションは、Microsoft Visual C++ コンパイラーでコンパイルされたアプリケーションに対してサポートされます。 ただし、アプリケーションがデータベース・コード・ページとは異なるコード・ページで Db2 データベースにデータを挿入する場合は、このコンパイラーで CONVERT オプションを使用しないでください。 Db2 サーバーは通常、この状況でコード・ページを変換します。ただし、Microsoft C ランタイム環境は、特定の 2 バイト文字の置換文字を処理しないため、実行時変換エラーが発生する可能性があります。
  2. WCHARTYPE CONVERT オプションを指定して C アプリケーションをプリコンパイルすると、 Db2 は、データが変換関数を介して渡される際に、入力と出力の両方でアプリケーションのグラフィック・データの妥当性検査を行います。 CONVERT オプションを使用しない場合は、 グラフィック・データの変換は行われず、したがって妥当性検査も行われません。 CONVERT アプリケーションと NOCONVERT アプリケーションの混合環境では、 無効なグラフィック・データが NOCONVERT アプリケーションによって挿入された後に CONVERT アプリケーションによって取り出される場合に、問題が生じることがあります。