ODBC 3.x アプリケーションの作成
ODBC 2.x アプリケーションを ODBC 3.x にアップグレードする場合は、ODBC 2.x ドライバーと 3.x ドライバーの両方で動作するように記述する必要があります。 アプリケーションには、ODBC 3.x 機能を最大限に活用するための条件付きコードを組み込む必要があります。
SQL_ATTR_ODBC_VERSION 環境属性は、SQL_OV_ODBC2 に設定する必要があります。 これにより、「動作変更」セクションで説明されている変更に関して、ドライバーが ODBC 2.x ドライバーと同様に動作するようになります。
アプリケーションで「新機能」セクションで説明されている機能のいずれかを使用する場合は、条件付きコードを使用して、ドライバーが ODBC 3.x ドライバーか ODBC 2.x ドライバーかを判断する必要があります。 アプリケーションでは、SQLGetDiagField と SQLGetDiagRec を使用して、これらの条件付きコード フラグメントに対してエラー処理を行いながら ODBC 3.x SQLSTATE を取得します。 新しい機能に関する次の点を考慮する必要があります。
行セット サイズの動作の変更の影響を受けるアプリケーションでは、配列サイズが 1 より大きい場合に SQLFetch を呼び出さないように注意する必要があります。 これらのアプリケーションは、SQLExtendedFetch の呼び出しを SQLSetStmtAttr の呼び出しに置き換えて、SQL_ATTR_ARRAY_STATUS_PTR ステートメント属性と SQLFetchScroll を設定し、ODBC 3.x ドライバーと ODBC 2.x ドライバーの両方で動作する共通コードを持つ必要があります。 SQL_ATTR_ROW_ARRAY_SIZE を持つ SQLSetStmtAttr は、ODBC 2.x ドライバーの SQL_ROWSET_SIZE を使用して SQLSetStmtAttr にマップされるため、アプリケーションは複数行フェッチ操作の SQL_ATTR_ROW_ARRAY_SIZE を設定できます。
アップグレード中のほとんどのアプリケーションは、実際には SQLSTATE コードの変更の影響を受けません。 影響を受けるアプリケーションでは、ほとんどの場合、"SQLSTATE Mapping" セクションのエラー変換テーブルを使用して、ODBC 3.x エラー コードを ODBC 2.x コードに変換することで、機械的な検索と置換を行うことができます。 ODBC 3.x ドライバー マネージャーは ODBC 2.x SQLSTATE から ODBC 3.x SQLSTATE へのマッピングを実行するため、これらのアプリケーション ライターは ODBC 3.x SQLSTATE のみをチェックする必要があり、ODBC 2.x SQLSTATE を条件付きコードに含める必要はありません。
アプリケーションで日付、時刻、タイムスタンプのデータ型を大幅に使用する場合、アプリケーションは自身を ODBC 2.x アプリケーションとして宣言し、コンディショニング コードを使用する代わりに既存のコードを使用できます。
アップグレードには、次の手順も含める必要があります。
接続を割り当てる前に SQLSetEnvAttr を呼び出して、SQL_ATTR_ODBC_VERSION 環境属性を SQL_OV_ODBC2 に設定します。
SQLAllocEnv、SQLAllocConnect、または SQLAllocStmt へのすべての呼び出しを、SQL_HANDLE_ENV、SQL_HANDLE_DBC、または SQL_HANDLE_STMT の適切な HandleType 引数を使用した SQLAllocHandle への呼び出しに置き換えます。
SQLFreeEnv または SQLFreeConnect のすべての呼び出しを、SQLFreeHandle の呼び出しに、SQL_HANDLE_DBC または SQL_HANDLE_STMT の適切な HandleType 引数に置き換えます。
SQLSetConnectOption のすべての呼び出しを SQLSetConnectAttr の呼び出しに置き換えます。 値が文字列である属性を設定する場合は、StringLength 引数を適切に設定します。 Attribute 引数を SQL_XXXX から SQL_ATTR_XXXX に変更します。
SQLGetConnectOption のすべての呼び出しを SQLGetConnectAttr の呼び出しに置き換えます。 文字列またはバイナリ属性を取得する場合は、BufferLength を適切な値に設定し、StringLength 引数を渡します。 Attribute 引数を SQL_XXXX から SQL_ATTR_XXXX に変更します。
SQLSetStmtOption のすべての呼び出しを SQLSetStmtAttr の呼び出しに置き換えます。 値が文字列である属性を設定する場合は、StringLength 引数を適切に設定します。 Attribute 引数を SQL_XXXX から SQL_ATTR_XXXX に変更します。
SQLGetStmtOption のすべての呼び出しを SQLGetStmtAttr の呼び出しに置き換えます。 文字列またはバイナリ属性を取得する場合は、BufferLength を適切な値に設定し、StringLength 引数を渡します。 Attribute 引数を SQL_XXXX から SQL_ATTR_XXXX に変更します。
SQLTransact のすべての呼び出しを SQLEndTran の呼び出しに置き換えます。 SQLTransact 呼び出しの右端の有効なハンドルが環境ハンドルの場合は、適切な Handle 引数を指定して SQLEndTran 呼び出しで SQL_HANDLE_ENV の HandleType 引数を使用する必要があります。 SQLTransact 呼び出しの右端の有効なハンドルが接続ハンドルの場合は、適切な Handle 引数を指定 SQL_HANDLE_DBC の HandleType 引数を SQLEndTran 呼び出しで使用する必要があります。
SQLColAttributes のすべての呼び出しを SQLColAttribute の呼び出しに置き換えます。 FieldIdentifier 引数が SQL_COLUMN_PRECISION、SQL_COLUMN_SCALE、または SQL_COLUMN_LENGTH のいずれかの場合は、関数の名前以外は変更しないでください。 そうでない場合は、FieldIdentifier を SQL_COLUMN_XXXX から SQL_DESC_XXXX に変更します。 FieldIdentifier が SQL_DESC_CONCISE_TYPE で、データ型が datetime データ型の場合は、対応する ODBC 3.x データ型に変更します。
ブロック カーソル、スクロール可能カーソル、またはその両方を使用している場合、アプリケーションは次の処理を行います。
SQLSetStmtAttr を使用して、行セットのサイズ、カーソルの種類、カーソルのコンカレンシーを設定します。
SQLSetStmtAttr を呼び出して、状態レコードの配列を指す SQL_ATTR_ROW_STATUS_PTR を設定します。
SQLSetStmtAttr を呼び出して、SQLINTEGER を指す SQL_ATTR_ROWS_FETCHED_PTR を設定します。
必要なバインディングを実行し、SQL ステートメントを実行します。
SQLFetchScroll をループで呼び出して行をフェッチし、結果セット内を移動します。
ブックマークでフェッチする場合、アプリケーションは SQLSetStmtAttr を呼び出して、フェッチする行のブックマークを含む変数に SQL_ATTR_FETCH_BOOKMARK_PTR を設定し、SQL_FETCH_BOOKMARK の FetchOrientation 引数を指定して SQLFetchScroll を呼び出します。
パラメーターの配列を使用する場合、アプリケーションは次の処理を行います。
SQLSetStmtAttr を呼び出して、SQL_ATTR_PARAMSET_SIZE 属性をパラメーター配列のサイズに設定します。
SQLSetStmtAttr を呼び出して、内部 UDWORD 変数を指す SQL_ATTR_ROWS_PROCESSED_PTR を設定します。
必要に応じて、準備、バインド、および実行操作を実行します。
何らかの理由で実行が停止した場合 (SQL_NEED_DATA など)、SQL_ATTR_ROWS_PROCESSED_PTR が指す場所を調べることで、パラメーターの "現在の" 行を見つけることができます。
このセクションでは、次のトピックを扱います。