Dela via


Använda längd- och indikatorvärden

Bufferten för längd/indikator används för att skicka bytelängden för data i databufferten eller en särskild indikator, till exempel SQL_NULL_DATA, vilket indikerar att data är NULL. Beroende på vilken funktion den används i definieras en längd/indikatorbuffert som en SQLINTEGER eller en SQLSMALLINT. Därför behövs ett enda argument för att beskriva det. Om databufferten är en icke-uppskjuten indatabuffert innehåller det här argumentet bytelängden för själva data eller ett indikatorvärde. Den heter ofta StrLen_or_Ind eller ett liknande namn. Följande kod anropar till exempel SQLPutData för att skicka en buffert full av data. bytelängden (ValueLen) skickas direkt eftersom databufferten (ValuePtr) är en indatabuffert.

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

Om databufferten är en uppskjuten indatabuffert, en icke-uppskjuten utdatabuffert eller en utdatabuffert innehåller argumentet adressen till längd-/indikatorbufferten. Den heter ofta StrLen_or_IndPtr eller ett liknande namn. Följande kod anropar till exempel SQLGetData för att hämta en buffert full av data. bytelängden returneras till programmet i längd-/indikatorbufferten (ValueLenOrInd), vars adress skickas till SQLGetData eftersom motsvarande databuffert (ValuePtr) är en icke-uppskjuten utdatabuffert.

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

Om det inte är särskilt förbjudet kan ett argument för längd/indikatorbuffert vara 0 (om icke-uppskjutna indata) eller en null-pekare (om utdata eller uppskjutna indata). För indatabuffertar gör detta att drivrutinen ignorerar bytelängden för data. Detta returnerar ett fel när du skickar data med variabel längd, men är vanligt vid överföring av data som inte är null, fast längd, eftersom varken en längd eller ett indikatorvärde behövs. För utdatabuffertar gör detta att drivrutinen inte returnerar bytelängden för data eller ett indikatorvärde. Det här är ett fel om de data som returneras av drivrutinen är NULL, men är vanliga vid hämtning av data med fast längd som inte kan nulleras, eftersom varken en längd eller ett indikatorvärde behövs.

Som när adressen till en fördröjd databuffert skickas till drivrutinen; måste adressen till en buffert för fördröjd längd/indikator förbli giltig tills bufferten är obunden.

Följande längder är giltiga som längd/indikatorvärden:

  • n, där n> 0.

  • SQL_NTS. En sträng som skickas till drivrutinen i motsvarande databuffert är null-avslutad. Detta är ett bekvämt sätt för C-programmerare att skicka strängar utan att behöva beräkna bytelängden. Det här värdet är endast lagligt när programmet skickar data till drivrutinen. När drivrutinen returnerar data till programmet returneras alltid den faktiska bytelängden för data.

Följande värden är giltiga som längd-/indikatorvärden. SQL_NULL_DATA lagras i beskrivningsfältet SQL_DESC_INDICATOR_PTR; alla andra värden lagras i beskrivningsfältet SQL_DESC_OCTET_LENGTH_PTR.

  • SQL_NULL_DATA. Data är ett NULL-datavärde och värdet i motsvarande databuffert ignoreras. Det här värdet är endast lagligt för SQL-data som skickas till eller hämtas från drivrutinen.

  • SQL_DATA_AT_EXEC. Databufferten innehåller inga data. I stället skickas data med SQLPutData när instruktionen körs eller när SQLBulkOperations eller SQLSetPos anropas. Det här värdet är endast lagligt för SQL-data som skickas till drivrutinen. Mer information finns i SQLBindParameter, SQLBulkOperations och SQLSetPos.

  • Resultatet av makrot SQL_LEN_DATA_AT_EXEC(längd). Det här värdet liknar SQL_DATA_AT_EXEC. Mer information finns i Skicka långa data.

  • SQL_NO_TOTAL. Drivrutinen kan inte fastställa antalet byte med långa data som fortfarande är tillgängliga för att returneras i en utdatabuffert. Det här värdet är endast lagligt för SQL-data som hämtats från drivrutinen.

  • SQL_DEFAULT_PARAM. En procedur är att använda standardvärdet för en indataparameter i en procedur i stället för värdet i motsvarande databuffert.

  • SQL_COLUMN_IGNORE. SQLBulkOperations eller SQLSetPos är att ignorera värdet i databufferten. När du uppdaterar en rad med data med ett anrop till SQLBulkOperations eller SQLSetPos ändras inte kolumnvärdet. När du infogar en ny rad med data med ett anrop till SQLBulkOperations, anges kolumnvärdet till standardvärdet eller, om kolumnen inte har något standardvärde, till NULL.