次の方法で共有


長さとインジケーター値の使用

長さ/インジケーター バッファーは、データ バッファー内のデータのバイト長、またはデータが NULL であることを示す特殊なインジケーター (SQL_NULL_DATAなど) を渡すために使用されます。 使用される関数に応じて、長さ/インジケーター バッファーは SQLINTEGER または SQLSMALLINT として定義されます。 したがって、それを記述するには 1 つの引数が必要です。 データ バッファーが既定以外の入力バッファーの場合、この引数にはデータ自体のバイト長またはインジケーター値が含まれます。 多くの場合、StrLen_or_Ind またはそれと似た名前で呼ばれます。 たとえば、次のコードは SQLPutData を 呼び出して、データがいっぱいのバッファーを渡します。データ バッファー (ValuePtr) は入力バッファーであるため、バイト長 (ValueLen) が直接渡されます。

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLen;  
  
// Call local function to place data in ValuePtr. In ValueLen, return the  
// number of bytes of data placed in ValuePtr. If there is not enough  
// data, this will be less than 50.  
FillBuffer(ValuePtr, sizeof(ValuePtr), &ValueLen);  
  
// Call SQLPutData to send the data to the driver.  
SQLPutData(hstmt, ValuePtr, ValueLen);  

データ バッファーが遅延入力バッファー、既定以外の出力バッファー、または出力バッファーの場合、引数には長さ/インジケーター バッファーのアドレスが含まれます。 多くの場合、 StrLen_or_IndPtr または同様の名前です。 たとえば、次のコードは SQLGetData を呼び出して、データがいっぱいのバッファーを取得します。バイト長は、対応するデータ バッファー (ValuePtr) が既定以外の出力バッファーであるため、アドレスが SQLGetData に渡される長さ/インジケーター バッファー (ValueLenOrInd) でアプリケーションに返されます。

SQLCHAR      ValuePtr[50];  
SQLINTEGER   ValueLenOrInd;  
SQLGetData(hstmt, 1, SQL_C_CHAR, ValuePtr, sizeof(ValuePtr), &ValueLenOrInd);  

特に禁止されていない限り、長さ/インジケーター バッファー引数は 0 (非定義入力の場合) または null ポインター (出力または遅延入力の場合) にすることができます。 入力バッファーの場合、ドライバーはデータのバイト長を無視します。 可変長データを渡すとエラーが返されますが、長さもインジケーター値も必要ないため、null 以外の固定長データを渡す場合は一般的です。 出力バッファーの場合、ドライバーはデータのバイト長またはインジケーター値を返しません。 これは、ドライバーによって返されるデータがNULLである場合にエラーとなりますが、固定長でNULLを許容しないデータを取得する際には一般的に発生します。この場合、長さやインジケータ値は不要です。

遅延データ バッファーのアドレスがドライバーに渡されるときと同様に、遅延長/インジケーター バッファーのアドレスは、バッファーがバインド解除されるまで有効なままである必要があります。

次の長さは、長さ/インジケーター値として有効です。

  • n、ここで n> 0。

  • SQL_NTS。 対応するデータ バッファー内のドライバーに送信される文字列は null で終了します。これは、Cプログラマがバイト長を計算することなく文字列を渡す便利な方法です。 この値は、アプリケーションがドライバーにデータを送信する場合にのみ有効です。 ドライバーは、アプリケーションにデータを返すとき、常にデータの実際のバイト長を返します。

次の値は、長さ/インジケーター値として有効です。 SQL_NULL_DATAは、SQL_DESC_INDICATOR_PTR記述子フィールドに格納されます。その他のすべての値は、SQL_DESC_OCTET_LENGTH_PTR記述子フィールドに格納されます。

  • SQL_NULL_DATA。 データは NULL データ値であり、対応するデータ バッファー内の値は無視されます。 この値は、ドライバーとの間で送受信される SQL データに対してのみ有効です。

  • SQL_DATA_AT_EXEC。 データ バッファーにデータが含まれていません。 代わりに、ステートメントの実行時、または SQLBulkOperations または SQLSetPos が呼び出されたときに、SQLPutData を使用してデータが送信されます。 この値は、ドライバーに送信される SQL データに対してのみ有効です。 詳細については、「 SQLBindParameterSQLBulkOperationsおよび SQLSetPos」を参照してください。

  • SQL_LEN_DATA_AT_EXEC(length) マクロの結果。 この値は、SQL_DATA_AT_EXECに似ています。 詳細については、「 長いデータの送信」を参照してください。

  • SQL_NO_TOTAL。 ドライバーは、出力バッファーで返すことができる長いデータのバイト数を判断できません。 この値は、ドライバーから取得された SQL データに対してのみ有効です。

  • SQL_DEFAULT_PARAM。 プロシージャは、対応するデータ バッファーの値ではなく、プロシージャ内の入力パラメーターの既定値を使用することです。

  • SQL_COLUMN_IGNORE。 SQLBulkOperations または SQLSetPos は、データ バッファー内の値を無視することです。 SQLBulkOperations または SQLSetPos の呼び出しによってデータ行を更新する場合、列の値は変更されません。 SQLBulkOperations の呼び出しによって新しいデータ行を挿入する場合、列の値は既定値に設定されます。列に既定値がない場合は NULL に設定されます。