次の方法で共有


検索ステートメントの構築

重要

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

位置指定更新ステートメントと delete ステートメントをサポートするために、カーソル・ライブラリーは、位置指定ステートメントから検索された UPDATE ステートメントまたは DELETE ステートメントを作成します。 データ ブロック内の SQLGetData の呼び出しをサポートするために、カーソル ライブラリは検索された SELECT ステートメントを作成して、現在のデータ行を含む結果セットを作成します。 これらの各ステートメントで、 WHERE 句は、 SQLColAttribute のSQL_DESC_SEARCHABLEフィールド識別子のSQL_PRED_SEARCHABLEまたはSQL_PRED_BASICを返すバインドされた各列のキャッシュに格納されている値を列挙します。

注意事項

現在の行を識別するためにカーソル ライブラリによって構築された WHERE 句は、行の識別、別の行の識別、または複数の行の識別に失敗する可能性があります。

位置指定更新ステートメントまたは delete ステートメントが複数の行に影響を与える場合、カーソル・ライブラリーは、カーソルが置かれている行についてのみ行状況配列を更新し、SQL_SUCCESS_WITH_INFOおよび SQLSTATE 01001 (カーソル操作の競合) を返します。 ステートメントで行が識別されない場合、カーソル・ライブラリーは行状況配列を更新せず、SQL_SUCCESS_WITH_INFOおよび SQLSTATE 01001 (カーソル操作の競合) を返します。 アプリケーションは SQLRowCount を呼び出して、更新または削除された行の数を決定できます。

SQLGetData の呼び出しにカーソルを置くために使用される SELECT 句が複数の行を識別する場合、SQLGetData は正しいデータを返す保証はありません。 行が識別されない場合、 SQLGetData はSQL_NO_DATAを返します。

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

  • 行を一意に識別する列をバインドします。 バインドされた列が行を一意に識別しない場合、カーソル ライブラリによって構築された WHERE 句は複数の行を識別する可能性があります。 位置指定の更新または削除ステートメントでは、このような句を使用すると、複数の行が更新または削除される可能性があります。 SQLGetData の呼び出しでは、このような句により、ドライバーが間違った行のデータを返す可能性があります。 一意キー内のすべての列をバインドすると、各行が一意に識別されます。

  • 切り捨てが行われずに十分な大きさのデータ バッファーを割り当てます。 カーソル ライブラリのキャッシュは、 SQLBindCol を使用して結果セットにバインドされた行セット バッファー内の値のコピーです。 データがこれらのバッファーに配置されるときに切り捨てられると、キャッシュ内でも切り捨てられます。 切り捨てられた値から構築された WHERE 句は、データ ソース内の基になる行を正しく識別できない可能性があります。

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

  • null 許容列に対して null 以外の長さのバッファーを指定します。 カーソル ライブラリは、SQLBindColStrLen_or_IndPtr引数が null 以外の場合にのみ、キャッシュに長さバッファーを割り当てます。 SQL_NULL_DATAは長さバッファーに格納されるため、カーソル ライブラリでは、長さバッファーが指定されていない列は null 非許容であると見なされます。 null 許容列に長さ列が指定されていない場合、カーソル ライブラリは列のデータ値を使用する WHERE 句を作成します。 この句は、行を正しく識別しません。