長度/指示緩衝區用於傳遞資料緩衝區中資料的位元組長度,或是特殊指示器如 SQL_NULL_DATA,表示資料為 NULL。 根據所使用的函式,長度/指示緩衝區可定義為 SQLINTEGER 或 SQLSMALLINT。 因此,需要一個單一的論證來描述它。 若資料緩衝區為非延遲輸入緩衝區,此參數包含資料本身的位元組長度或指示值。 它常被稱為 StrLen_or_Ind 或類似名稱。 例如,以下程式碼呼叫 SQLPutData 以傳遞一個充滿資料的緩衝區;位元組長度(ValueLen)是直接傳遞的,因為資料緩衝區(ValuePtr)是輸入緩衝區。
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),該位址會傳給 SQLGetData ,因為對應的資料緩衝區(ValuePtr)是非延遲輸出緩衝區。
SQLCHAR ValuePtr[50];
SQLINTEGER ValueLenOrInd;
SQLGetData(hstmt, 1, SQL_C_CHAR, ValuePtr, sizeof(ValuePtr), &ValueLenOrInd);
除非特別禁止,長度/指示緩衝區參數可為 0(若為非延遲輸入)或為空指標(若為輸出或延遲輸入)。 對於輸入緩衝區,這會導致驅動程式忽略資料的位元組長度。 當傳遞可變長度資料時會回傳錯誤,但當傳遞非空、固定長度資料時則常見,因為不需要長度或指示值。 對於輸出緩衝區,這會導致驅動程式不會回傳資料的位元組長度或指示值。 若驅動程式回傳的資料為 NULL,則為錯誤,但在擷取固定長度且不可空的資料時常見,因為不需要長度或指示值。
如同延遲資料緩衝區位址傳給驅動程式時,延遲長度/指示緩衝區的位址也必須保持有效,直到這些緩衝區解除綁定。
以下長度作為長度/指示值有效:
n,其中 n> 0。
-
SQL_NTS。 在對應資料緩衝區中傳送給驅動程式的字串會被終止為空;這是 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 資料。 欲了解更多資訊,請參閱 SQLBindParameter、 SQLBulkOperations 及 SQLSetPos。
SQL_LEN_DATA_AT_EXEC(長度)巨集的結果。 這個數值與SQL_DATA_AT_EXEC相似。 欲了解更多資訊,請參閱 「傳送長資料」。
SQL_NO_TOTAL。 驅動程式無法判斷輸出緩衝區中仍有多少長資料位元組可供返回。 此值僅適用於從驅動程式取得的 SQL 資料。
SQL_DEFAULT_PARAM。 程序是使用程序中輸入參數的預設值,而非對應資料緩衝區的值。
SQL_COLUMN_IGNORE。 SQLBulkOperations 或 SQLSetPos 是忽略資料緩衝區中的值。 當透過呼叫 SQLBulkOperations 或 SQLSetPos 更新資料列時,欄位值不會被更改。 當呼叫 SQLBulkOperations 插入新資料列時,欄位值會設為預設值,若欄位沒有預設值則設為 NULL。