使用长度和指示器值
长度/指示器缓冲区用于传递数据缓冲区中数据的字节长度或特殊指示器(如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 指针(如果是输出或延迟输入)。 对于输入缓冲区,这会导致驱动程序忽略数据的字节长度。 这会在传递可变长度数据时返回错误,但在传递非 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 数据合法。 有关详细信息,请参阅 SQLBindParameter、SQLBulkOperations 和 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。