Condividi tramite


Lunghezza dei dati, lunghezza del buffer e troncamento

La lunghezza dei dati è la lunghezza in byte dei dati, così come verrebbero archiviati nel buffer di dati dell'applicazione, non come vengono archiviati nell'origine dati. Questa distinzione è importante perché i dati vengono spesso archiviati in tipi diversi nel buffer di dati rispetto all'origine dati. Pertanto, per i dati inviati all'origine dati, si tratta della lunghezza in byte dei dati prima della conversione nel tipo dell'origine dati. Per i dati recuperati dall'origine dati, si tratta della lunghezza in byte dei dati dopo la conversione nel tipo del buffer di dati e prima del troncamento.

Per i dati a lunghezza fissa, ad esempio un numero intero o una struttura di date, la lunghezza in byte dei dati è sempre la dimensione del tipo di dati. In generale, le applicazioni allocano un buffer di dati che corrisponde alle dimensioni del tipo di dati. Se l'applicazione alloca un buffer più piccolo, le conseguenze sono indefinite perché il driver presuppone che il buffer di dati sia la dimensione del tipo di dati e non tronchi i dati in modo da inserirli in un buffer più piccolo. Se l'applicazione alloca un buffer più grande, lo spazio aggiuntivo non viene mai usato.

Per i dati a lunghezza variabile, come i dati di tipo carattere o binario, è importante riconoscere che la lunghezza in byte dei dati è separata, e spesso diversa, dalla lunghezza in byte del buffer. La relazione di queste due lunghezze è descritta nella sezione Buffer. Se la lunghezza in byte dei dati è maggiore della lunghezza in byte del buffer, il driver tronca i dati recuperati alla lunghezza in byte del buffer e restituisce SQL_SUCCESS_WITH_INFO con SQLSTATE 01004 (dati troncati). Tuttavia, la lunghezza in byte restituita è la lunghezza dei dati non troncati.

Si supponga, ad esempio, che un'applicazione allochi 50 byte per un buffer di dati binari. Se il driver ha 10 byte di dati binari da restituire, restituisce quei 10 byte nel buffer. La lunghezza in byte dei dati è 10 e la lunghezza in byte del buffer è 50. Se il driver ha 60 byte di dati binari da restituire, tronca i dati a 50 byte, restituisce tali byte nel buffer e restituisce SQL_SUCCESS_WITH_INFO. La lunghezza in byte dei dati è 60 (la lunghezza prima del troncamento) e la lunghezza in byte del buffer è ancora 50.

Viene creato un record di diagnostica per ogni colonna troncata. Poiché il driver ha bisogno di tempo per creare questi record e affinché l'applicazione li elabori, il troncamento può ridurre le prestazioni. In genere, un'applicazione può evitare questo problema allocando buffer abbastanza grandi, anche se ciò potrebbe non essere possibile quando si lavora con dati lunghi. Quando si verifica il troncamento dei dati, l'applicazione può talvolta allocare un buffer più grande e riassegnare i dati; questo non è vero in tutti i casi. Se il troncamento si verifica durante il recupero di dati con chiamate a SQLGetData, l'applicazione non deve chiamare SQLGetData per i dati già restituiti. Per altre informazioni, vedere Recupero di dati lunghi.