Buffer

Un buffer è qualsiasi parte di memoria dell'applicazione usata per passare i dati tra l'applicazione e il driver. Ad esempio, i buffer dell'applicazione possono essere vincolati o associati a colonne del set di risultati con SQLBindCol. Quando ogni riga viene recuperata, i dati vengono restituiti per ogni colonna in questi buffer. I buffer di input vengono usati per passare i dati dall'applicazione al driver; i buffer di output vengono usati per restituire dati dal driver all'applicazione.

Nota

Se una funzione ODBC restituisce SQL_ERROR, il contenuto di qualsiasi argomento di output su tale funzione non è definito.

Questa discussione riguarda principalmente i buffer di tipo indeterminato. Gli indirizzi di questi buffer vengono visualizzati come argomenti di tipo SQLPOINTER, ad esempio l'argomento TargetValuePtr in SQLBindCol. Tuttavia, alcuni degli elementi qui descritti, ad esempio gli argomenti usati con i buffer, si applicano anche agli argomenti usati per passare stringhe al driver, come l'argomento TableName in SQLTables.

Questi buffer in genere sono in coppia. I buffer di dati vengono usati per passare i dati stessi, mentre i buffer di lunghezza/indicatore vengono usati per passare la lunghezza dei dati nel buffer dei dati o un valore speciale, ad esempio SQL_NULL_DATA, che indica che i dati sono NULL. La lunghezza dei dati in un buffer di dati è diversa dalla lunghezza del buffer dei dati stesso. Nella figura seguente viene illustrata la relazione tra il buffer di dati e il buffer di lunghezza/indicatore.

Data buffer and length/indicator buffer

Un buffer di lunghezza/indicatore è necessario ogni volta che il buffer dei dati contiene dati a lunghezza variabile, ad esempio dati di tipo carattere o binario. Se il buffer dei dati contiene dati a lunghezza fissa, ad esempio una struttura di numeri interi o date, è necessario un buffer di lunghezza/indicatore solo per passare i valori indicatore perché la lunghezza dei dati è già nota. Se un'applicazione usa un buffer di lunghezza/indicatore con dati a lunghezza fissa, il driver ignora le lunghezze passate.

La lunghezza sia del buffer dei dati che dei dati contenuti viene misurata in byte, anziché in caratteri. Questa distinzione non è importante per i programmi che usano stringhe ANSI perché le lunghezze in byte e caratteri sono uguali.

Quando il buffer dei dati rappresenta un campo descrittore definito dal driver, un campo di diagnostica o un attributo, l'applicazione deve indicare a Gestione driver la natura dell'argomento funzione che indica il valore del campo o dell'attributo. L'applicazione esegue questa operazione impostando l'argomento length in qualsiasi chiamata di funzione che imposta il campo o l'attributo su uno dei valori seguenti. Lo stesso vale per le funzioni che recuperano i valori del campo o dell'attributo, con l'eccezione che l'argomento punta ai valori che per la funzione di impostazione si trovano nell'argomento stesso.

  • Se l'argomento della funzione che indica il valore del campo o dell'attributo è un puntatore a una stringa di caratteri, l'argomento length corrisponde alla lunghezza della stringa o SQL_NTS.

  • Se l'argomento della funzione che indica il valore del campo o dell'attributo è un puntatore a un buffer binario, l'applicazione inserisce il risultato della macro SQL_LEN_BINARY_ATTR(length) nell'argomento length. In questo modo viene impostato un valore negativo nell'argomento length.

  • Se l'argomento della funzione che indica il valore del campo o dell'attributo è un puntatore a un valore diverso da una stringa di caratteri o da una stringa binaria, l'argomento length deve avere il valore SQL_IS_POINTER.

  • Se l'argomento della funzione che indica il valore del campo o dell'attributo contiene un valore a lunghezza fissa, l'argomento length è SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT o SQL_ISI_USMALLINT, in base alle esigenze.

Questa sezione descrive gli argomenti seguenti: