Share via


バッファー

バッファーは、アプリケーションとドライバーの間でデータを渡すために使用される任意のアプリケーション メモリです。 たとえば、アプリケーション バッファーは、SQLBindCol を使用して結果セットの列に関連付けたり、バインドしたりできます。 各行がフェッチされると、これらのバッファー内の各列のデータが返されます。 入力バッファーは、アプリケーションからドライバーにデータを渡すために使用されます。出力バッファーは、ドライバーからアプリケーションにデータを返すために使用されます。

Note

ODBC 関数が SQL_ERROR を返す場合、その関数に対するすべての出力引数の内容は未定義になります。

この説明は、主に不確定型のバッファーに関連します。 これらのバッファーのアドレスは、SQLBindColTargetValuePtr 引数など、SQLPOINTER 型の引数として表示されます。 ただし、バッファーで使用される引数など、ここで説明する項目の一部は、SQLTablesTableName 引数など、ドライバーに文字列を渡すために使用される引数にも適用されます。

通常、これらのバッファーはペアになります。 データ バッファーはデータ自体を渡すために使用されますが、長さ/インジケーター バッファーは、データ バッファー内のデータの長さ、またはデータが NULL であることを示す特殊な値 (SQL_NULL_DATA など) を渡すために使用されます。 データ バッファー内のデータの長さは、データ バッファー自体の長さとは異なります。 次の図は、バック バッファーとフロント バッファーの関係を示しています。

Data buffer and length/indicator buffer

長さ/インジケーター バッファーは、データ バッファーに文字データやバイナリ データなどの可変長データが含まれている場合に必ず必要です。 データ バッファーに整数や日付構造などの固定長データが含まれている場合、長さ/インジケーター バッファーは、データの長さが既にわかっているため、インジケーター値を渡すためだけに必要です。 アプリケーションが固定長データを持つ長さ/インジケーター バッファーを使用する場合、ドライバーは渡された長さを無視します。

データ バッファーとデータに含まれるデータの両方の長さは、文字ではなくバイト単位で測定されます。 ANSI 文字列を使用するプログラムでは、バイトと文字の長さが同じであるため、この区別は重要ではありません。

データ バッファーがドライバー定義の記述子フィールド、診断フィールド、または属性を表す場合、アプリケーションは、フィールドまたは属性の値を示す関数引数の性質をドライバー マネージャーに示す必要があります。 アプリケーションは、フィールドまたは属性を次のいずれかの値に設定する関数呼び出しで length 引数を設定することによってこれを行います。 (フィールドまたは属性の値を取得する関数でも同じですが、引数が引数自体の設定値を指している点を除きます)。

  • フィールドまたは属性の値を示す関数引数が文字列へのポインターである場合、 長さ引数は文字列または SQL_NTS の長さです。

  • フィールドまたは属性の値を示す関数引数がバイナリ バッファーへのポインターである場合、アプリケーションは長さ引数に SQL_LEN_BINARY_ATTR(length) マクロの結果を配置します。 これにより、長さ引数に負の値が格納されます。

  • フィールドまたは属性の値を示す関数引数が文字列またはバイナリ文字列以外の値へのポインターである場合、長さ引数には値 SQL_IS_POINTER が必要です。

  • フィールドまたは属性の値を示す関数引数に固定長値が含まれている場合、必要に応じて、長さ引数は SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT、または SQL_ISI_USMALLINT になります。

このセクションでは、次のトピックを扱います。