Sdílet prostřednictvím


Použití hodnot délky a indikátorových hodnot

Vyrovnávací paměť pro délku/indikátor se používá k předání bajtové délky dat v datové vyrovnávací paměti nebo ke speciálnímu indikátoru, jako je SQL_NULL_DATA, což značí, že data mají hodnotu NULL. V závislosti na funkci, v níž se používá, je délková/indikátorová vyrovnávací paměť definována jako SQLINTEGER nebo SQLSMALLINT. Proto je k popisu potřeba jeden argument. Pokud je vyrovnávací pamětí dat nedeferovaná vstupní vyrovnávací paměť, obsahuje tento argument délku bajtů samotných dat nebo hodnotu ukazatele. Často se jmenuje StrLen_or_Ind nebo podobný název. Například následující kód volá SQLPutData pro předání datového vyrovnávacího bufferu. Délka v bajtech (ValueLen) se předává přímo, protože datový vyrovnávací buffer (ValuePtr) je vstupní buffer.

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);  

Pokud je vyrovnávací paměť dat odloženou vstupní vyrovnávací pamětí, neodloženou výstupní vyrovnávací pamětí, nebo výstupní vyrovnávací pamětí, argument obsahuje adresu vyrovnávací paměti délky/ukazatele. Často se nazývá StrLen_or_IndPtr nebo podobný název. Například následující kód volá SQLGetData k načtení vyrovnávací paměti plné dat; délka v bajtech je vrácena aplikaci ve vyrovnávací paměti délky/indikátoru (ValueLenOrInd), jejíž adresa je předána SQLGetData, protože odpovídající vyrovnávací paměť dat (ValuePtr) je nedeferovaná výstupní vyrovnávací paměť.

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

Pokud to není výslovně zakázáno, může být argumentem vyrovnávací paměti délky/ukazatele hodnota 0 (pokud není odložený vstup) nebo nulový ukazatel (pokud je výstup nebo odložený vstup). U vstupních vyrovnávacích pamětí to způsobí, že ovladač ignoruje délku bajtů dat. Při předávání dat s proměnnou délkou to vrátí chybu, ale je běžné při předávání dat pevné délky bez hodnoty null, protože není potřeba zadávat ani délku ani hodnotu ukazatele. U výstupních vyrovnávacích pamětí to způsobí, že ovladač nevrátí délku dat v bajtech ani hodnotu indikátoru. Jedná se o chybu v případě, že data vrácená ovladačem mají hodnotu NULL, ale je běžná při načítání dat s pevnou délkou, která není nullable, protože není nutná délka ani hodnota ukazatele.

Stejně jako když je adresa odložené vyrovnávací paměti dat předána ovladači, musí adresa odložené vyrovnávací paměti délky/ukazatele zůstat platná, dokud nebude vyrovnávací paměť osvobozena.

Následující délky jsou platné jako hodnoty délky/ukazatele:

  • n, kde n> 0.

  • SQL_NTS. Řetězec odeslaný ovladači v odpovídající vyrovnávací paměti dat je ukončen s hodnotou null; to je pohodlný způsob, jak programátoři jazyka C předat řetězce bez nutnosti vypočítat jejich bajtovou délku. Tato hodnota je legální pouze v případě, že aplikace odesílá data ovladači. Když ovladač vrátí data do aplikace, vrátí vždy skutečnou délku bajtů dat.

Následující hodnoty jsou platné jako hodnoty délky a ukazatele. SQL_NULL_DATA je uložen v poli popisovače SQL_DESC_INDICATOR_PTR; všechny ostatní hodnoty jsou uloženy v poli popisovače SQL_DESC_OCTET_LENGTH_PTR.

  • SQL_NULL_DATA. Data jsou datovou hodnotou NULL a hodnota v odpovídající vyrovnávací paměti dat se ignoruje. Tato hodnota je legalní pouze pro data SQL odesílaná do ovladače nebo načtená z ovladače.

  • SQL_DATA_AT_EXEC. Datový buffer neobsahuje žádná data. Místo toho budou data odeslána pomocí SQLPutData při spuštění příkazu nebo při volání SQLBulkOperations nebo SQLSetPos . Tato hodnota je legální pouze pro data SQL odesílaná do ovladače. Další informace naleznete v tématu SQLBindParameter, SQLBulkOperations a SQLSetPos.

  • Výsledek makra SQL_LEN_DATA_AT_EXEC(délka). Tato hodnota je podobná SQL_DATA_AT_EXEC. Další informace naleznete v tématu Odesílání dlouhých dat.

  • SQL_NO_TOTAL. Ovladač nemůže určit počet bajtů dlouhých dat, které jsou stále k dispozici pro vrácení ve výstupní vyrovnávací paměti. Tato hodnota je legální pouze pro data SQL načtená z ovladače.

  • SQL_DEFAULT_PARAM. Procedurou je použít výchozí hodnotu vstupního parametru v postupu místo hodnoty v odpovídající vyrovnávací paměti dat.

  • SQL_COLUMN_IGNORE. SQLBulkOperations nebo SQLSetPos je ignorovat hodnotu ve vyrovnávací paměti dat. Při aktualizaci řádku dat voláním SQLBulkOperations nebo SQLSetPos se hodnota sloupce nezmění. Při vkládání nového řádku dat voláním SQLBulkOperations je hodnota sloupce nastavena na výchozí hodnotu nebo pokud sloupec nemá výchozí hodnotu NULL.