検索されたステートメントの構築

Important

この機能は、今後のバージョンの Windows で削除される予定です。 新しい開発作業ではこの機能を使用しないでください。現在この機能を使用しているアプリケーションを変更することを計画してください。 Microsoft では、ドライバーのカーソル機能を使用することをお勧めします。

位置づけされた更新・削除文をサポートするために、カーソルライブラリは位置づけ文から検索済みの UPDATE 文または DELETE 文を作成します。 データブロック内の SQLGetData 呼び出しをサポートするために、カーソルライブラリは検索した SELECT 文を作成し、現在のデータ行を含む結果セットを作成します。 これらの文それぞれにおいて、 WHERE 節は SQLColAttributeのSQL_DESC_SEARCHABLEフィールド識別子に対してSQL_PRED_SEARCHABLEまたはSQL_PRED_BASICを返す各バウンドカラムのキャッシュに格納された値を列挙します。

Caution

カーソルライブラリが現在の行を識別するために構築する WHERE 節は、行を識別できなかったり、別の行を識別できなかったり、複数の行を識別できなかったりすることがあります。

位置付けされた更新または削除文が複数の行に影響を与える場合、カーソルライブラリはカーソルが置かれた行の行ステータス配列のみを更新し、SQL_SUCCESS_WITH_INFOとSQLSTATE 01001(カーソル操作の競合)を返します。 文が行を識別しない場合、カーソルライブラリは行の状態配列を更新せず、SQL_SUCCESS_WITH_INFOとSQLSTATE 01001(カーソル操作の競合)を返します。 アプリケーションは SQLRowCount を呼び出して、更新または削除された行数を確認できます。

SQLGetDataへの呼び出し時にカーソルを配置するSELECT節が複数の行を識別した場合、SQLGetDataは正しいデータを必ずしも返すとは限りません。 行を識別しない場合は、 SQLGetData はSQL_NO_DATAを返します。

アプリケーションが以下のガイドラインに準拠している場合、カーソルライブラリで構築された WHERE 節は現在の行を一意に識別するはずですが、データソースに重複行が含まれている場合など不可能な場合を除きます。

  • 行を一意に識別する列をバインドします。 もしバウンドされた列が行を一意に識別しない場合、カーソルライブラリで構築された WHERE 節が複数の行を識別することがあります。 位置付けされたupdateやdelete文では、そのような節が複数の行を更新または削除することがあります。 SQLGetDataへの呼び出しでは、このような節がドライバーが誤った行のデータ返しを引き起こすことがあります。 すべての列を一意キーにバインドすることで、各行が一意に識別されることが保証されます。

  • 切断が起こらないほど十分なデータバッファを割り当てます。 カーソルライブラリのキャッシュは 、SQLBindColで結果セットにバインドされた行セットバッファ内の値のコピーです。 これらのバッファにデータを置く際に切断されると、キャッシュ内でも切断されます。 切断された値から構成された WHERE 節は、データソース内の基礎となる行を正しく識別できない場合があります。

  • バイナリCデータにはヌルでない長さのバッファを指定します。 カーソルライブラリは、SQLBindColStrLen_or_IndPtr引数がnullでない場合のみキャッシュに長さバッファを割り当てます。 TargetType引数がSQL_C_BINARYされると、カーソルライブラリはデータからWHERE節を構成するためにバイナリデータの長さを必要とします。 SQL_C_BINARY列の長さバッファがなく、アプリケーションが SQLGetData を呼び出したり、位置付けされたupdateやdelete文を実行しようとした場合、カーソルライブラリはSQL_ERRORとSQLSTATE SL014(位置要求が発行され、すべての列数フィールドがバッファリングされていない)を返します。

  • null可能な列にはnullでない長さバッファを指定します。 カーソルライブラリは、SQLBindColStrLen_or_IndPtr引数がnullでない場合のみキャッシュに長さバッファを割り当てます。 SQL_NULL_DATAが長さバッファに保存されているため、カーソルライブラリは長さバッファが指定されていない列は非ゼロであると仮定します。 もしnullable columnの長さが指定されていない場合、カーソルライブラリはその列のデータ値を使用する WHERE 節を構築します。 この節は行を正しく識別しません。