リリース情報


40.3 CLI の手引きおよび解説書

40.3.1 第 3 章 拡張フィーチャーの使用法

以下は、この章の新しいセクションです。

40.3.1.1 DB2 CLI ユニコード・アプリケーションの作成

DB2 CLI ユニコード・アプリケーションのサポート領域には次の 2 つがあります。

  1. ANSI ストリング引き数の代わりにユニコード・ストリング引き数を受け入れ可能な 関数のセットの追加。
  2. ANSI またはユニコード・データとしてデータを記述する、新しい C および SQL データ・ タイプの追加。以下のセクションは、これらの領域の両方についての詳細を提供します。 ユニコード・アプリケーションと認識されるためには、アプリケーションは接続を行う前に、 SQL_ATTR_ANSI_APP 接続属性を SQL_AA_FALSE に設定する必要があります。これにより、 CLI はユニコード・クライアントとして接続し、ユニコード・データはすべて、 CHAR データでは UTF-8、GRAPHIC データでは UCS-2 で送信されます。

ユニコード関数

以下は、ユニコード (W) および ANSI (A) の両方をサポートする ODBC API 関数の リストです (ユニコードの関数名には W が付きます)。

SQLBrowseConnect        SQLForeignKeys          SQLPrimaryKeys
SQLColAttribute         SQLGetConnectAttr       SQLProcedureColumns
SQLColAttributes        SQLGetConnectOption     SQLProcedures
SQLColumnPrivileges     SQLGetCursorName        SQLSetConnectAttr
SQLColumns              SQLGetDescField         SQLSetConnectOption
SQLConnect              SQLGetDescRec           SQLSetCursorName
SQLDataSources          SQLGetDiagField         SQLSetDescField
SQLDescribeCol          SQLGetDiagRec           SQLSetStmtAttr
SQLDriverConnect        SQLGetInfo              SQLSpecialColumns
SQLDrivers              SQLGetStmtAttr          SQLStatistics
SQLError                SQLNativeSQL            SQLTablePrivileges
SQLExecDirect           SQLPrepare              SQLTables

常にストリング長引き数を返す、または取得するユニコード関数は、文字数の カウントとして渡されます。サーバー・データに対して長さの情報を返す関数では、 表示サイズは文字の数で示されます。長さ (データの転送サイズ) がストリングまたは ストリング以外のデータを参照するときは、長さはオクテット長で示されます。 たとえば、SQLGetInfoW は長さをバイト・カウントとして取りますが、SQLExecDirectW は 文字数のカウントを使用します。CLI は結果セットを、アプリケーションのバインドに 応じてユニコードまたは ANSI で返します。アプリケーションが SQL_C_CHAR にバインドする 場合、ドライバーは SQL_WCHAR データを SQL_CHAR に変換します。ドライバー・マネージャーは、 ANSI ドライバーについては SQL_C_WCHAR を SQL_C_CHAR にマップしますが、ユニコード・ ドライバーについてはマッピングを行いません。

新しいデータ・タイプと有効な変換

2 つの新しい CLI または ODBC 定義のデータ・タイプ、SQL_C_WCHAR および SQL_WCHAR が あります。SQL_C_WCHAR は、C バッファーに UCS-2 データが含まれていることを指示します。 SQL_WCHAR は、特定の列またはパラメーター・マーカーにユニコード・データが含まれて いることを指示します。DB2 ユニコード・サーバーの場合、漢字列は SQL_WCHAR として 記述されます。漢字データ間で行われるのと同様に、SQL_C_WCHAR と SQL_CHAR、 SQL_LONGVARCHAR と SQL_CLOB の間で変換が行われます。


表 32. サポートされるデータ変換
SQL データ・タイプ
S
Q
L
_
C_
CH
A
R
S
Q
L
_
C_
W
CH
A
R
S
Q
L
_
C_
L
O
N
G
S
Q
L
_
C_
S
H
O
RT
S
Q
L
_
C_
TI
N
YI
N
T


S
Q
L
_
C_
F
L
O
A
T

S
Q
L
_
C_
D
O
U
B
L
E
S
Q
L
_
C_
TYP
E_
D
A
TE
S
Q
L
_
C_
TYP
E_
TI
M
E
S
Q
L
_
C_
TYP
E_
TI
M
ES
TA
M
P
S
Q
L
_
C_
B
I
N
A
RY
S
Q
L
_
C_
B
I
T
S
Q
L
_
C_
D
B
CH
A
R
S
Q
L
_
C_
CL
O
B
_
L
O
CA
TO
R
S
Q
L
_
C_
B
L
O
B
_
L
O
CA
TO
R
S
Q
L
_
C_
D
B
CL
O
B
_
L
O
CA
TO
R
S
Q
L
_
C_
B
I
G
I
N
T
S
Q
L
_
C_
N
U
M
ERI
C
BLOB
X
X









D




X
CHAR
D
X
X
X
X
X
X
X
X
X
X
X




X
X
CLOB
D
X









X



X


DATE
X
X






D


X






DBCLOB


X









X


D



X
DECIMAL
D
X
X
X
X
X
X




X
X




X
X
DOUBLE
X
X
X
X
X
X
D





X




X
X
FLOAT
X
X
X
X
X
X
D





X




X
X
GRAPHIC(非ユニコード)
X
X











D



GRAPHIC(ユニコード)
X
X
X
X
X
X
X
X
X
X
X
X
D




X


INTEGER
X
X
D
X
X
X
X





X




X
X
LONG
VARCHAR
D
X









X





LONG
VARGRAPHIC(非ユニコード)
X
X









X


D



LONG
VARGRAPHIC(ユニコード)
X
X









X


D






NUMERIC
D
X
X
X
X
X
X





X




X
REAL
X
X
X
X
X
D
X





X




X
SMALLINT
X
X
X
D
X
X
X





X




X
X
BIGINT
X
X
X
X
X
X
X




X
X




D
X
TIME
X
X







D
X






TIMESTAMP
X
X






X
X
D






VARCHAR
D
X
X
X
X
X
X
X
X
X
X
X




X
X
VARGRAPHIC(非ユニコード)
X
X











D



VARGRAPHIC(ユニコード)
X
X
X
X
X
X
X
X
X
X
X
X
D




X


注:

D
変換がサポートされています。これは SQL データ・タイプのデフォルト変換です。

X
IBM DBMS はすべて変換をサポートしています。

ブランク
IBM DBMS は変換をサポートしていません。

古いキーワード/パッチ値

ユニコード・アプリケーションがサポートされる以前、単一バイト文字データを 操作するために書かれたアプリケーションは、GRAPHIC=1,2 または 3, Patch2=7 のような、 一連の cli ini ファイル・キーワードによって 2 バイト漢字データを 操作することができました。このような回避策は、文字データとして漢字データを 表示し、報告されるデータの長さにも影響します。

これらのキーワードはユニコード・アプリケーションには不要になったばかりでなく、 使用すると深刻な副次作用を招くおそれがあります。あるアプリケーションがユニコード・ アプリケーションかどうかがわからない場合は、漢字データの処理に影響する キーワードなしで試してみることをお勧めします。

ユニコード・データベースのリテラル

非ユニコード・データベースでは、LONG VARGRAPHIC および LONG VARCHAR 列の データは比較できません。GRAPHIC/VARGRAPHIC および CHAR/VARCHAR 列のデータは、 比較のみが可能か、または暗黙的コード・ページ変換がサポートされていないため、 明示的な cast 関数を使用して相互に割り当てることができます。 これには、GRAPHIC/VARGRAPHIC リテラルが G 接頭部によって CHAR/VARCHAR と 区別される、GRAPHIC/VARGRAPHIC および CHAR/VARCHAR が含まれます。

ユニコード・データベースについては、GRAPHIC/VARGRAPHIC および CHAR/VARCHAR リテラル間の キャストは不要です。また、G 接頭部は GRAPHIC/VARGRAPHIC リテラルの 前には必要ありません。少なくとも 1 つの引き数がリテラルの場合、暗黙的変換が 行われます。これにより、リテラルは G 接頭部を持っていても持っていなくても、 SQLPrepareW() または SQLExecDirect() を使用するステートメント内で使用することが できます。LONG VARGRAPHIC のリテラルには G 接頭部が必要です。

詳しくは、SQL 解説書 の第 3 章、言語エレメントの 「データ・タイプ間のキャスト」 を参照してください。

新しい CLI 構成キーワード

ユニコード・アプリケーションがデータベースに接続するときに余分なオーバーヘッドを 避けるために、次の 3 つのキーワードが追加されました。

  1. DisableUnicode

    キーワードの説明:
    ユニコードのサポートを使用不可にします。

    db2cli.ini キーワード構文
    DisableUnicode = 0 | 1

    デフォルト設定
    0 (false)

    DB2 CLI/ODBC 設定タブ:
    このキーワードは CLI/ODBC 設定ノートブックで設定することはできません。 このキーワードを使用するためには、db2cli.ini ファイルを直接編集する必要があります。

    使用上の注意:

    ユニコード・サポートを使用可能にして、ユニコード・アプリケーションから 呼び出すと、CLI はコード・ページ変換による不要なデータ損失のないように、 最適なクライアント・コード・ページを使用してデータベースに接続しようとします。 これにより、コード・ページ交換のために接続時間が増加するか、またはこのサポートが 追加される前には行われたことのないクライアントでのコード・ページ変換が行われる 可能性があります。

    このキーワードを True に設定すると、すべてのユニコード・データが、 サーバーに送信される前にアプリケーションのローカル・コード・ページに変換されます。 これにより、ローカル・コード・ページでは表示できないデータが失われることがあります。

  2. ConnectCodepage

    キーワードの説明:
    余分な接続オーバーヘッドを避けるために、データ・ソースに接続するときに 使用する特定のコード・ページを指定します。

    db2cli.ini キーワード構文
    ConnectCodepage = 0 | 1 <有効な db2 コード・ページ>

    デフォルト設定
    0

    DB2 CLI/ODBC 設定タブ:
    このキーワードは CLI/ODBC 設定ノートブックで設定することはできません。 このキーワードを使用するためには、db2cli.ini ファイルを直接編集する必要があります。

    使用上の注意:

    非ユニコード・アプリケーションは常に、アプリケーションのローカル・コード・ページ、 または DB2Codepage 環境設定を使用してデータベースに接続します。デフォルトでは、CLI は 常にユニコード・アプリケーションが UTF-8 または UCS-2 コード・ページを使用して ユニコード・データベースに接続するように、またはデータベースのコード・ページを 使用して非ユニコード・データベースに接続するようにします。これにより、コード・ページ 変換による不要なデータ損失を避けることができます。

    このキーワードを使用すると、 ユーザーは接続時の余分なオーバーヘッドを避けるために、ユニコード・データベースへの 接続時にデータベースのコード・ページを指定することができます。

    値 1 を 指定すると、SQLDriverConnect() は出力接続ストリングに正しい値を返します。 これにより値を以降の SQLDriverConnect() 呼び出しで使用することができます。

  3. UnicodeServer

    キーワードの説明:
    データ・ソースがユニコード・サーバーであることを指示します。ConnectCodepage=1208 の 設定と同じです。

    db2cli.ini キーワード構文
    UnicodeServer = 0 | 1

    デフォルト設定
    0

    DB2 CLI/ODBC 設定タブ:
    このキーワードは CLI/ODBC 設定ノートブックで設定することはできません。 このキーワードを使用するためには、db2cli.ini ファイルを直接編集する必要があります。

    使用上の注意:

    このキーワードは ConnectCodepage=1208 と同じもので、便宜上追加されたものです。 DB2 (OS/390 版) バージョン 7 またはそれ以降に接続するときの余分な接続オーバーヘッドを 避けるためにこのキーワードを設定してください。DB2 (Windows 版)、DB2 (Unix 版)、 または DB2 (OS/2 版) については、余分な処理が必要にならないため、このキーワードを 設定する必要はありません。

40.3.2 付録 C. DB2 CLI および ODBC

以下の新しいセクションがこの付録に追加されました。

40.3.2.1 ODBC ユニコード・アプリケーション

ユニコード ODBC アプリケーションは、主に UCS-2 で文字を検索します。これは、 ODBC 関数 (接尾部 "W") のユニコード・バージョンを呼び出し、ユニコード・データ・タイプを 指示することで行われます。アプリケーションはローカル・コード・ページを明示的に 指定しません。それでもアプリケーションは ANSI 関数を呼び出し、ローカル・コード・ページ・ ストリングを渡すことができます。

たとえば、アプリケーションは SQLConnectW() を呼び出し、DSN、ユーザー ID、および パスワードをユニコード引き数として渡すことができます。次にアプリケーションは、 SQLExecDirectW() を呼び出し、ユニコード SQL ステートメント・ストリングを渡し、 ANSI ローカル・コード・ページ・バッファー (SQL_C_CHAR) およびユニコード・ バッファー (SQL_C_WCHAR) の組み合わせをバインドします。データベース・データ・ タイプはローカル・コード・ページ、または UCS-2 と UTF-8 になります。

CLI アプリケーションが SQLConnectW を呼び出すか、または SQL_ATTR_ANSI_APP を SQL_AA_FALSE に 設定して SQLSetConnectAttr を呼び出す場合、アプリケーションはユニコード・アプリケーションと 見なされます。このことは、CHAR データはすべて、データベースとの間で UTF-8 形式で 送受信されることを意味しています。アプリケーションはこの後 CHAR データを、 SQL_C_CHAR バッファーにローカル・コード・ページで取り出すか (データ損失の可能性があります)、 または SQL_C_WCHAR バッファーに UCS-2 でデータを損失することなく取り出すことが できます。

アプリケーションが上記 2 つの呼び出しのどちらも行わない場合、CHAR データは サーバーでアプリケーション・ローカル・コード・ページに変換されます。このことは、 SQL_C_WCHAR に取り出された CHAR データがデータ損失を被る可能性があることを 意味しています。

DB2CODEPAGE インスタンス変数が (db2set を使用して) コード・ページ 1208 (UTF-8) に 設定された場合、アプリケーションはすべての CHAR データを UTF-8 で受け取ります。 これは、UTF-8 がローカル・コード・ページになっているためです。アプリケーションはまた、 CHAR 入力データもすべて UTF-8 であることを確認する必要もあります。ODBC は、 SQL_C_WCHAR データがすべてネイティブ・エンディアン形式であると想定します。CLI は、 SQL_C_WCHAR について必要なバイト反転を実行します。

ODBC ユニコードと非ユニコード・アプリケーション

このリリースの DB2 ユニバーサル・データベースには SQLConnectW() API が含まれています。 ユニコード・ドライバーは、ドライバー・マネージャーにユニコード・ドライバーとして 認識されるように、SQLConnectW をエクスポートする必要があります。 多くの ODBC アプリケーション (Microsoft Access や Visual Basic など) は SQLConnectW() を 呼び出すことに注意してください。DB2 ユニバーサル・データベースの前のリリースでは、 DB2 CLI はこの API をサポートしていなかったので、ODBC ドライバー・マネージャーは これをユニコード・ドライバーとして認識しませんでした。 このため、ODBC ドライバー・マネージャーはすべてのユニコード・データをアプリケーションの ローカル・コード・ページに変換していました。SQLConnectW() 関数のサポートが追加された ことで、これらのアプリケーションはユニコード・アプリケーションに接続し、DB2 CLI が 必要なデータ変換をすべて行うようになりました。

DB2 CLI は現在、ユニコード API (接尾部 "W" が付きます) を受け入れます。 ODBC は接尾部 "A" の関数のセットを定義しますが、ドライバー・マネージャーは 接尾部 "A" の ANSI 関数をドライバーに渡しません。代わりに、これらの関数を ANSI 関数 呼び出しに変換し、ドライバーに渡します。

SQLConnectW() API を呼び出す ODBC アプリケーションは、ユニコード・アプリケーションと 見なされます。ODBC ドライバー・マネージャーは呼び出されるアプリケーションのバージョンに かかわらず常に SQLConnectW() API を呼び出すため、SQL_ATTR_ANSI_APP 接続属性を使用して、 アプリケーションが ANSI か UNICODE のどちらと考えられるかをドライバーに通知します。 SQL_ATTR_ANSI_APP が SQL_AA_FALSE に設定されていない場合、DB2 CLI はすべての ユニコード・データを、サーバーに送る前にローカル・コード・ページに変換します。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]