Condividi tramite


Uso dei valori di lunghezza e degli indicatori

Il buffer di lunghezza/indicatore viene usato per passare la lunghezza dei byte dei dati nel buffer di dati o un indicatore speciale, ad esempio SQL_NULL_DATA, che indica che i dati sono NULL. A seconda della funzione in cui viene usata, viene definito un buffer di lunghezza/indicatore come SQLINTEGER o SQLSMALLINT. Pertanto, è necessario un singolo argomento per descriverlo. Se il buffer di dati è un buffer di input non differito, questo argomento contiene la lunghezza in byte dei dati stessi o un valore di indicazione. Viene spesso denominato StrLen_or_Ind o un nome simile. Ad esempio, il codice seguente chiama SQLPutData per passare un buffer pieno di dati; La lunghezza dei byte (ValueLen) viene passata direttamente perché il buffer di dati (ValuePtr) è un buffer di input.

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

Se il buffer di dati è un buffer di input posticipato, un buffer di output non posticipato o un buffer di output, l'argomento contiene l'indirizzo del buffer di lunghezza/indicatore. Viene spesso denominato StrLen_or_IndPtr o un nome simile. Ad esempio, il codice seguente chiama SQLGetData per recuperare un buffer pieno di dati; La lunghezza dei byte viene restituita all'applicazione nel buffer di lunghezza/indicatore (ValueLenOrInd), il cui indirizzo viene passato a SQLGetData perché il buffer di dati corrispondente (ValuePtr) è un buffer di output non dedotto.

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

A meno che non sia esplicitamente vietato, un argomento di buffer di lunghezza/indicatore può essere 0 (se non è stato posticipato l'input) o un puntatore Null (se l'output o l'input posticipato). Per i buffer di input, il driver ignora la lunghezza dei byte dei dati. Viene restituito un errore durante il passaggio di dati a lunghezza variabile, ma è comune quando si passano dati a lunghezza fissa non Null, perché non è necessaria né una lunghezza né un valore indicatore. Per i buffer di output, in questo modo il driver non restituisce la lunghezza dei byte dei dati o un valore indicatore. Si verifica un errore se i dati restituiti dal driver sono NULL. Tuttavia, è comune mentre si recuperano dati a lunghezza fissa e non annullabili, poiché né una lunghezza né un valore indicatore sono necessari.

Come quando l'indirizzo di un buffer di dati posticipato viene passato al driver, l'indirizzo di un buffer di lunghezza/indicatore posticipato deve rimanere valido fino a quando il buffer non è svincolato.

Le lunghezze seguenti sono valide come valori di lunghezza/indicatore:

  • n, dove n> 0.

  • SQL_NTS. Una stringa inviata al driver nel buffer di dati corrispondente è con terminazione Null; questo è un modo pratico per i programmatori C di passare stringhe senza dover calcolare la lunghezza dei byte. Questo valore è valido solo quando l'applicazione invia dati al driver. Quando il driver restituisce i dati all'applicazione, restituisce sempre la lunghezza effettiva dei byte dei dati.

I valori seguenti sono validi come valori di lunghezza/indicatore. SQL_NULL_DATA viene archiviato nel campo descrittore SQL_DESC_INDICATOR_PTR; tutti gli altri valori vengono archiviati nel campo descrittore SQL_DESC_OCTET_LENGTH_PTR.

  • SQL_NULL_DATA. I dati sono un valore di dati NULL e il valore nel buffer di dati corrispondente viene ignorato. Questo valore è valido solo per i dati SQL inviati o recuperati dal driver.

  • SQL_DATA_AT_EXEC. Il buffer di dati non contiene dati. I dati verranno invece inviati con SQLPutData quando viene eseguita l'istruzione o quando viene chiamato SQLBulkOperations o SQLSetPos . Questo valore è valido solo per i dati SQL inviati al driver. Per altre informazioni, vedere SQLBindParameter, SQLBulkOperations e SQLSetPos.

  • Risultato della macro SQL_LEN_DATA_AT_EXEC(lunghezza). Questo valore è simile a SQL_DATA_AT_EXEC. Per altre informazioni, vedere Invio di dati lunghi.

  • SQL_NO_TOTAL. Il driver non è in grado di determinare il numero di byte di dati lunghi ancora disponibili per la restituzione in un buffer di output. Questo valore è valido solo per i dati SQL recuperati dal driver.

  • SQL_DEFAULT_PARAM. Una routine consiste nell'usare il valore predefinito di un parametro di input in una routine anziché il valore nel buffer di dati corrispondente.

  • SQL_COLUMN_IGNORE. SQLBulkOperations o SQLSetPos consiste nell'ignorare il valore nel buffer di dati. Quando si aggiorna una riga di dati tramite una chiamata a SQLBulkOperations o SQLSetPos, il valore della colonna non viene modificato. Quando si inserisce una nuova riga di dati da una chiamata a SQLBulkOperations, il valore della colonna viene impostato sul valore predefinito oppure, se la colonna non ha un valore predefinito, su NULL.