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

長さ/インジケーター バッファーは、データ バッファー内のデータのバイト長、またはデータが 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 を呼び出してデータがいっぱいのバッファーを取得します。バイト長は長さ/インジケーター バッファー (ValueLenOrInd) 内のアプリケーションに返されます。このバイト長は、対応するデータ バッファー (ValuePtr) が既定以外の出力バッファーであるため、そのアドレスが SQLGetData に渡されます。

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

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

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

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

  • n, where 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(長さ) マクロの結果。 この値は、SQL_DATA_AT_EXEC に似ています。 詳細については、「Long データの送信」を参照してください。

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

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

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