バージョン 2.1.0 と 1.x の相違点を以下で説明します。
DB2 CLI の以前のバージョンでは、自動コミットはサポートされておらず (各ステートメントはトランザクションである)、そのため AUTOCOMMIT がオフに設定されているのと同じことでした。 DB2 CLI バージョン 2.1 になって自動コミットがサポートされるようになりましたが、 ODBC との整合性をとるために、省略時の自動コミットの動作はオンになっています。
既存の DB2 CLI アプリケーションを以前のバージョンと同じ動作で実行させるには、 AUTOCOMMIT キーワードを 0 に設定します。このキーワードはすべてのアプリケーションに適用されます。それで、新規のアプリケーションではこのキーワードを明示的に指定変更し、自動コミット接続オプションを要求された値に設定します。
バージョン 2.1 では CURSOR WITH HOLD の指定がサポートされており、その省略時設定は、保留の指定 がオンです。以前のバージョンではこの指定がサポートされていなかったので、保留の指定 (with hold) は事実上オフに設定されていました。
この変更は自動コミットほどアプリケーションの動作に影響を与えるものではありませんが、 CURSORHOLD キーワードは 0 (コミット後にカーソルは保守されない) に設定してください。このキーワードはすべてのアプリケーションに適用されます。それで、新規のアプリケーションではこのキーワードを明示的に指定変更し、 CURSORHOLD オプションを要求された値に設定します。
以下に示す #define 値は、
ODBC アプリケーションで使用できるようにバージョン 2.1 で変更されています。 DB2 CLI は以前の値も受け入れますが、これらの値を使用する既存のアプリケーションを再コンパイルすることをお勧めします。
上記の値は sqlcli.h ヘッダー・ファイルに定義されています。
以前のバージョンでは、DB2 CLI は S1009 SQLSTATE を戻し、 ODBC 定義のより明示的な S1090〜S1110 の一連の SQLSTATE は戻しません。
X/Open もこの範囲の SQLSTATE を使用しているので、 DB2 CLI バージョン 2.1 も、このより明示的な SQLSTATE を戻します。
DB2 CLI のバージョン 2.1 で複数の接続をサポートしていることにより、組み込み SQL と DB2 CLI を混合して使用している既存のアプリケーションには影響が出る可能性があります。
ご使用のアプリケーションが、以下の条件を満たしている場合、
2 番目の接続は、最初の接続と接続タイプが異なるため、失敗します。
アプリケーションは、DB2 CLI 関数を呼び出す前に、CONNECT RESET を出すことが必要になります。
注: | アプリケーション側では、常に接続を明示的にリセットするようにします。 |
FOR BIT DATA 文節を用いて定義された文字データは、 SQL_C_BINARY の省略時 C バッファー・タイプに関連付けられています。データが FOR BIT DATA として定義されている場合は、そのデータは以下の宛先に転送されます。
SQL_C_CHAR に FOR BIT DATA として定義されたデータを指定して明示的に使用する既存のアプリケーションは、入手する結果が異なり、元のデータの半分だけを受け取ることになる可能性があります。初期設定キーワード BITDATA を 0 に設定することにより、 DB2 CLI が FOR BIT DATA を必ず以前のバージョンと同様に処理するようにしておくことができます。
既存のアプリケーションは、ユーザー定義タイプを利用できるように表が修正されているかどうかによって影響を受ける場合があります。
照会ステートメントの述部にパラメーター・マーカーが使用されており、かつ、そのパラメーターがユーザー定義タイプである場合には、ステートメントに CAST 関数を使用して、パラメーター・マーカーまたは UDT のいずれかをキャストしなければなりません。
たとえば、次のようにタイプおよび表が定義されているとします。
CREATE DISTINCT TYPE CNUM AS INTEGER WITH COMPARISONS CREATE TABLE CUSTOMER ( Cust_Num CNUM NOT NULL, First_Name CHAR(30) NOT NULL, Last_Name CHAR(30) NOT NULL, Phone_Num CHAR(20) WITH DEFAULT, PRIMARY KEY (Cust_Num) )
このステートメントはパラメーター・マーカーがタイプ CNUM にはならないために失敗し、したがってタイプに互換性がないことから比較が失敗して、次のようになります。
SELECT first_name, last_name, phone_num FROM customer where cust_num = ?
列を整数 (その基本 SQL タイプ) にキャストすると、パラメーターには整数のタイプが与えられるので、比較を実行することができます。
SELECT first_name, last_name, phone_num from customer where cast( cust_num as integer ) = ?
あるいは、パラメーター・マーカーを INTEGER にキャストすることもできます。これにより、サーバーにパラメーター・マーカーのタイプが通知され、省略時設定の INTEGER - CNUM 変換を適用することができます。
SELECT first_name, last_name, phone_num FROM customer where cust_num = cast( ? as integer )
完全な作業サンプルについては、custrep.c サンプル・ファイルを参照してください。
以下の詳細については、SQL 解説書 を参照してください。
バージョン 2.1 以前のバージョンでは、DB2 CLI は SQL_CONVERT_ で始まる (たとえば、 SQL_CONVERT_INTEGER) fInfoTypes のビット・マスクの集まりを戻します。 fInfoTypes は、ここでは SQL_CVT_ で始まる (たとえば、 SQL_CVT_CHAR) 比較ビット・マスクに対応して用いられています。
この fInfoType は、サポートされている変換関数を示すために ODBC によって定義されたものであり、現在これらの関数はサポートされていないため、 DB2 CLI バージョン 2.1 は今のところすべての SQL_CONVERT fInfoTypes に (正しく) ゼロを戻します。
X/Open と ODBC の連携を高めるため、 DB2 CLI 関数の引き数の一部が無符号データ・タイプに変更され、かつ 2 つのタイプ SQLUINTEGER および SQLUSMALLINT が新たに導入されました。
バージョン 2.1 以前の DB2 CLI アプリケーションでは、バージョン 2.1 のヘッダー・ファイルを用いてコンパイルをかけたときに DB2CLI_VER が定義されていないと、関数引き数の不一致によるコンパイラー・エラーが生成されます。 DB2CLI_VER 定義の設定を参照してください。
SQLUINTEGER および SQLUSMALLINT のタイプを使用することによって既存のソース・ファイルを修正し、必要な引き数を宣言しておくことをお勧めします。
DB2CLI_VER 定義により、アプリケーションは DB2 CLI ヘッダー・ファイルが以前のバージョンの DB2 CLI との互換性を保つように指定することができます。
DB2CLI_VER は、DB2 CLI を組み込む前にコンパイル・フラグまたは #define のいずれかとして 16 進値で設定しなければなりません。たとえば、-D コンパイラー・フラグを使用した場合、
-DDB2CLI_VER=0x0110
は、DB2CLI_VER をバージョン 1.1 に設定していることを表します。
バージョン 2.1 で DB2CLI_VER が定義されていない場合、省略時設定で 0x0210 になります。