Funzione SQLSetDescField

Conformità
Versione introdotta: Conformità agli standard ODBC 3.0: ISO 92

Sommario
SQLSetDescField imposta il valore di un singolo campo di un record descrittore.

Syntax

SQLRETURN SQLSetDescField(  
     SQLHDESC      DescriptorHandle,  
     SQLSMALLINT   RecNumber,  
     SQLSMALLINT   FieldIdentifier,  
     SQLPOINTER    ValuePtr,  
     SQLINTEGER    BufferLength);  

Arguments

DescriptorHandle
[Input] Handle descrittore.

RecNumber
[Input] Indica il record descrittore contenente il campo che l'applicazione intende impostare. I record descrittori sono numerati da 0, con il record numero 0 che rappresenta il record segnalibro. L'argomento RecNumber viene ignorato per i campi di header.

FieldIdentifier
[Input] Indica il campo del descrittore il cui valore deve essere impostato. Per maggiori informazioni, consulta "FieldIdentifier Argument" nella sezione "Commenti".

ValuePtr
[Input] Puntatore a un buffer contenente le informazioni del descrittore, o a un valore intero. Il tipo di dato dipende dal valore di FieldIdentifier. Se ValuePtr è un valore intero, può essere considerato come 8 byte (SQLLEN), 4 byte (SQLINTEGER) o 2 byte (SQLSMALLINT), a seconda del valore dell'argomento FieldIdentifier .

BufferLength
[Input] Se FieldIdentifier è un campo definito da ODBC e ValuePtr punta a una stringa di caratteri o a un buffer binario, questo argomento dovrebbe essere la lunghezza di *ValuePtr. Per i dati della stringa di caratteri, questo argomento dovrebbe contenere il numero di byte nella stringa.

Se FieldIdentifier è un campo definito da ODBC e ValuePtr è un intero, BufferLength viene ignorato.

Se FieldIdentifier è un campo definito dal driver, l'applicazione indica la natura del campo al Driver Manager impostando l'argomento BufferLength . BufferLength può avere i seguenti valori:

  • Se ValuePtr è un puntatore a una stringa di caratteri, allora BufferLength è la lunghezza della stringa o della SQL_NTS.

  • Se ValuePtr è un puntatore a un buffer binario, allora l'applicazione inserisce il risultato della macro SQL_LEN_BINARY_ATTR(length) in BufferLength. Questo attribuisce un valore negativo a BufferLength.

  • Se ValuePtr è un puntatore a un valore diverso da una stringa di caratteri o da una stringa binaria, allora BufferLength dovrebbe avere il valore SQL_IS_POINTER.

  • Se ValuePtr contiene un valore a lunghezza fissa, allora BufferLength è SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT o SQL_IS_USMALLINT, a seconda dei conti.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR o SQL_INVALID_HANDLE.

Diagnostics

Quando SQLSetDescField restituisce SQL_ERROR o SQL_SUCCESS_WITH_INFO, un valore SQLSTATE associato può essere ottenuto chiamando SQLGetDiagRec con un HandleType di SQL_HANDLE_DESC e un Handle di DescriptorHandle. La tabella seguente elenca i valori SQLSTATE comunemente restituiti da SQLSetDescField e li spiega nel contesto di questa funzione; la notazione "(DM)" precede le descrizioni degli stati SQL restituite dal Driver Manager. Il codice restituito associato a ogni valore SQLSTATE è SQL_ERROR, a meno che non sia specificato diversamente.

SQLSTATE Error Description
01000 Avviso generale Messaggio informativo specifico del driver. (La funzione restituisce SQL_SUCCESS_WITH_INFO.
01S02 Valore dell'opzione modificato Il driver non supportava il valore specificato in *ValuePtr (se ValuePtr era un puntatore) o il valore in ValuePtr (se ValuePtr era un valore intero), oppure *ValuePtr era invalido a causa delle condizioni di funzionamento dell'implementazione, quindi il driver sostituiva un valore simile. (La funzione restituisce SQL_SUCCESS_WITH_INFO.
07009 Indice descrittore non valido L'argomento FieldIdentifier era un campo di record, l'argomento RecNumber era 0, e l'argomento DescriptorHandle si riferiva a un handle IPD.

L'argomento RecNumber era inferiore a 0, e l'argomento DescriptorHandle si riferiva a un ARD o a un APD.

L'argomento RecNumber era superiore al numero massimo di colonne o parametri che la sorgente dati può supportare, e l'argomento DescriptorHandle si riferiva a un APD o ARD.

(DM) L'argomento FieldIdentifier era SQL_DESC_COUNT, e l'argomento *ValuePtr era inferiore a 0.

L'argomento RecNumber era uguale a 0, e l'argomento DescriptorHandle si riferiva a un APD implicitamente assegnato. (Questo errore non si verifica con un descrittore applicativo esplicitamente allocato, perché non si sa se un descrittore applicativo esplicitamente allocato sia un APD o un ARD fino al momento dell'esecuzione.)
08S01 Errore del collegamento di comunicazione Collegamento di comunicazione tra il driver e l'origine dati a cui è stato connesso il driver non è riuscito prima del completamento dell'elaborazione della funzione.
22001 Dati stringa, troncati a destra L'argomento FieldIdentifier era SQL_DESC_NAME, e l'argomento BufferLength era un valore maggiore di SQL_MAX_IDENTIFIER_LEN.
HY000 Errore generale Si è verificato un errore per il quale non è stato specificato SQLSTATE e per il quale non è stato definito alcun SQLSTATE specifico dell'implementazione. Il messaggio di errore restituito da SQLGetDiagRec nel buffer *MessageText descrive l'errore e la relativa causa.
HY001 Errore di allocazione della memoria Il driver non è riuscito ad allocare memoria necessaria per supportare l'esecuzione o il completamento della funzione.
HY010 Errore della sequenza di funzioni (DM) Il DescriptorHandle era associato a un StatementHandle per cui veniva chiamata una funzione asincrona (non questa) e continuava a essere eseguita quando questa funzione veniva chiamata.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos veniva chiamato per il StatementHandle con cui il DescriptorHandle era associato e restituiva SQL_NEED_DATA. Questa funzione è stata chiamata prima dell'invio dei dati per tutti i parametri o le colonne data-at-execution.

(DM) Una funzione a esecuzione asincrona veniva chiamata per il handle di connessione associato al DescriptorHandle. Questa funzione asincrona era ancora in esecuzione quando veniva chiamata la funzione SQLSetDescField .

(DM) SQLExecute, SQLExecDirect o SQLMoreResults veniva chiamato per uno dei handle delle istruzioni associate al DescriptorHandle e restituiva SQL_PARAM_DATA_AVAILABLE. Questa funzione è stata chiamata prima del recupero dei dati per tutti i parametri trasmessi.
HY013 Errore di gestione della memoria Impossibile elaborare la chiamata di funzione perché non è stato possibile accedere agli oggetti di memoria sottostanti, probabilmente a causa di condizioni di memoria insufficiente.
HY016 Non può modificare un descrittore di riga di implementazione L'argomento DescriptorHandle era associato a un IRD, e l'argomento FieldIdentifier non era SQL_DESC_ARRAY_STATUS_PTR né SQL_DESC_ROWS_PROCESSED_PTR.
HY021 Informazioni incoerenti sui descrittori I campi SQL_DESC_TYPE e SQL_DESC_DATETIME_INTERVAL_CODE non costituiscono un tipo valido di ODBC SQL, né un tipo SQL valido specifico per driver (per gli IPD), né un valido tipo ODBC C (per APD o ARD).

Le informazioni dei descrittori controllate durante un controllo di coerenza non erano coerenti. (Vedi "Controllo di coerenza" in SQLSetDescRec.)
HY090 Lunghezza della stringa o del buffer non valida (DM) *ValuePtr è una stringa di caratteri, e BufferLength era inferiore a zero ma non uguale a SQL_NTS.

(DM) Il driver era un driver ODBC 2*.x*, il descrittore era un ARD, l'argomento ColumnNumber era impostato a 0 e il valore specificato per l'argomento BufferLength non era uguale a 4.
HY091 Identificatore del campo descrittore non valido Il valore specificato per l'argomento FieldIdentifier non era un campo definito da ODBC e non era un valore definito dall'implementazione.

L'argomento FieldIdentifier era invalido per l'argomento DescriptorHandle .

L'argomento FieldIdentifier era un campo di sola lettura, definito da ODBC.
HY092 Identificatore di attributo/opzione invalido Il valore in *ValuePtr non era valido per l'argomento FieldIdentifier .

L'argomento FieldIdentifier era SQL_DESC_UNNAMED, e ValuePtr era SQL_NAMED.
HY105 Tipo di parametro non valido (DM) Il valore specificato per il campo SQL_DESC_PARAMETER_TYPE era invalido. (Per maggiori informazioni, consulta la sezione "InputOutputType Argument" in SQLBindParameter.)
HY117 La connessione viene sospesa a causa dello stato sconosciuto della transazione. Sono consentite solo funzioni disconnesse e di sola lettura. (DM) Per maggiori informazioni sullo stato sospeso, vedi Cosa c'è di nuovo in ODBC 3.8.
HYT01 Il timeout della connessione è scaduto Periodo di timeout della connessione scaduto prima che l'origine dati rispondesse alla richiesta. Il periodo di timeout della connessione viene impostato tramite SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Il driver non supporta questa funzione (DM) Il driver associato al DescriptorHandle non supporta la funzione.

Comments

Un'applicazione può chiamare SQLSetDescField per impostare qualsiasi campo descrittore uno alla volta. Una chiamata a SQLSetDescField imposta un singolo campo in un singolo descrittore. Questa funzione può essere chiamata per impostare qualsiasi campo in qualsiasi tipo di descrittore, a condizione che il campo possa essere impostato. (Vedi la tabella più avanti in questa sezione.)

Note

Se una chiamata a SQLSetDescField fallisce, il contenuto del record descrittore identificato dall'argomento RecNumber non è definito.

Altre funzioni possono essere chiamate per impostare più campi descrittori con una singola chiamata della funzione. La funzione SQLSetDescRec imposta una varietà di campi che influenzano il tipo di dato e il buffer legati a una colonna o parametro (i campi SQL_DESC_TYPE, SQL_DESC_DATETIME_INTERVAL_CODE, SQL_DESC_OCTET_LENGTH, SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR e SQL_DESC_INDICATOR_PTR). SQLBindCol o SQLBindParameter possono essere utilizzati per creare una specifica completa per il binding di una colonna o parametro. Queste funzioni impostano un gruppo specifico di campi descrittori con una chiamata di funzione.

SQLSetDescField può essere chiamato per modificare i binding buffer aggiungendo un offset ai puntatori di binding (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR o SQL_DESC_OCTET_LENGTH_PTR). Questo modifica i binding buffer senza chiamare SQLBindCol o SQLBindParameter, il che permette a un'applicazione di cambiare SQL_DESC_DATA_PTR senza modificare altri campi, come SQL_DESC_DATA_TYPE.

Se un'applicazione chiama SQLSetDescField per impostare un campo diverso da SQL_DESC_COUNT o dai campi differiti SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR o SQL_DESC_INDICATOR_PTR, il record diventa svincolato.

I campi di header dei descrittori vengono impostati chiamando SQLSetDescField con il FieldIdentifier appropriato. Molti campi di header sono anche attributi di un'istruzione, quindi possono essere impostati anche tramite una chiamata a SQLSetStmtAttr. Questo permette alle applicazioni di impostare un campo descrittore senza prima ottenere un handle descrittore. Quando SQLSetDescField viene chiamato per impostare un campo di header, l'argomento RecNumber viene ignorato.

Un RecNumber pari a 0 viene usato per impostare i campi di segnalibri.

Note

L'attributo dell'istruzione SQL_ATTR_USE_BOOKMARKS deve sempre essere impostato prima di chiamare SQLSetDescField per impostare i campi di segnalibri. Anche se non è obbligatorio, è fortemente raccomandato.

Sequenza dei campi descrittori di impostazione

Quando si impostano i campi descrittori chiamando SQLSetDescField, l'applicazione deve seguire una sequenza specifica:

  1. L'applicazione deve prima impostare il campo SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE o SQL_DESC_DATETIME_INTERVAL_CODE.

  2. Dopo che uno di questi campi è stato impostato, l'applicazione può impostare un attributo di un tipo di dato, e il driver imposta i campi di attributo del tipo di dato ai valori predefiniti appropriati per il tipo di dato. L'impostazione automatica predefinita dei campi di attributo di tipo garantisce che il descrittore sia sempre pronto all'uso una volta che l'applicazione ha specificato un tipo di dato. Se l'applicazione imposta esplicitamente un attributo di tipo di dato, essa sta sovrascrivendo l'attributo predefinito.

  3. Dopo che uno dei campi elencati nel passo 1 è stato impostato e gli attributi del tipo di dato sono stati impostati, l'applicazione può impostare SQL_DESC_DATA_PTR. Questo richiede un controllo di coerenza dei campi descrittori. Se l'applicazione cambia il tipo di dato o gli attributi dopo aver impostato il campo SQL_DESC_DATA_PTR, il driver imposta SQL_DESC_DATA_PTR su un puntatore nullo, liberando il record. Questo costringe l'applicazione a completare i passaggi corretti in sequenza, prima che il record descrittore sia utilizzabile.

Inizializzazione dei campi del descrittore

Quando viene assegnato un descrittore, i campi nel descrittore possono essere inizializzati a un valore predefinito, inizializzati senza un valore predefinito o essere indefiniti per il tipo di descrittore. Le tabelle seguenti indicano l'inizializzazione di ogni campo per ogni tipo di descrittore, con "D" che indica che il campo è inizializzato con un valore predefinito, e "ND" che indica che il campo è inizializzato senza un valore predefinito. Se viene mostrato un numero, il valore predefinito del campo è quel numero. Le tabelle indicano anche se un campo è di lettura/scrittura (R/W) o di sola lettura (R).

I campi di un IRD hanno un valore predefinito solo dopo che l'istruzione è stata preparata o eseguita e l'IRD è stato popolato, non quando il handle o il descrittore dell'istruzione sono stati assegnati. Fino a quando l'IRD non è stato popolato, qualsiasi tentativo di accedere a un campo di un IRD restituirà un errore.

Alcuni campi descrittori sono definiti per uno o più, ma non tutti, i tipi di descrittori (ARD e IRD, e APD e IPD). Quando un campo non è definito per un tipo di descrittore, nessuna delle funzioni che lo utilizzano è necessario.

I campi accessibili da SQLGetDescField non possono necessariamente essere impostati da SQLSetDescField. I campi che possono essere impostati da SQLSetDescField sono elencati nelle tabelle seguenti.

L'inizializzazione dei campi di intestazione è descritta nella tabella che segue.

Nome del campo di intestazione Tipo R/W Default
SQL_DESC_ALLOC_TYPE SQLSMALLINT ARD: R APD: R IRD: R IPD: R ARD: SQL_DESC_ALLOC_AUTO per implicito o SQL_DESC_ALLOC_USER per esplicito

APD: SQL_DESC_ALLOC_AUTO per implicito o SQL_DESC_ALLOC_USER per esplicito

IRD: SQL_DESC_ALLOC_AUTO

IPD: SQL_DESC_ALLOC_AUTO
SQL_DESC_ARRAY_SIZE SQLULEN ARD: R/W APD: R/W IRD: IPD INUTILIZZATO: INUTILIZZATO ARD:[1] APD:[1] IRD: IPD inutilizzato: inutilizzato
SQL_DESC_ARRAY_STATUS_PTR SQLUSMALLINT* ARD: R/W APD: R/W IRD: R/W IPD: R/W ARD: Null ptr APD: Null ptr IRD: Null ptr IPD: Null ptr
SQL_DESC_BIND_OFFSET_PTR SQLLEN* ARD: R/W APD: R/W IRD: IPD INUTILIZZATO: INUTILIZZATO ARD: Null ptr APD: Null ptr IRD: IPD inutilizzato: Non utilizzato
SQL_DESC_BIND_TYPE SQLINTEGER ARD: R/W APD: R/W IRD: IPD INUTILIZZATO: INUTILIZZATO ARD: SQL_BIND_BY_COLUMN

APD: SQL_BIND_BY_COLUMN

IRD: Non utilizzato

IPD: Inutilizzato
SQL_DESC_COUNT SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: 0 APD: 0 IRD: D IPD: 0
SQL_DESC_ROWS_PROCESSED_PTR SQLULEN* ARD: AP inutilizzato: Non utilizzato IRD: R/W IPD: R/W ARD: APD inutilizzato: IRD non utilizzato: Null ptr IPD: Null ptr

[1] Questi campi sono definiti solo quando l'IPD viene automaticamente popolato dal driver. In caso contrario, non sono definiti. Se un'applicazione tenta di impostare questi campi, verrà restituito SQLSTATE HY091 (Identificatore di campo descrittore invalido).

L'inizializzazione dei campi di record è come mostrato nella tabella seguente.

Nome del campo del record Tipo R/W Default
SQL_DESC_AUTO_UNIQUE_VALUE (indicatore per valori unici generati automaticamente) SQLINTEGER ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_BASE_COLUMN_NAME SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_BASE_TABLE_NAME SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_CASE_SENSITIVE SQLINTEGER ARD: APD inutilizzato: IRD INUTILIZZATO: R IPD: R ARD: AP inutilizzato: Non utilizzato IRD: D IPD: D[1]
SQL_DESC_CATALOG_NAME SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_CONCISE_TYPE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: SQL_C_ DEFAULT APD: SQL_C_ DEFAULT IRD: D IPD: ND
SQL_DESC_DATA_PTR SQLPOINTER ARD: R/W APD: R/W IRD: IPD INUTILIZZATO: INUTILIZZATO ARD: Null ptr APD: Null ptr IRD: IPD inutilizzato: Inutilizzato[2]
SQL_DESC_DATETIME_INTERVAL_CODE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_DATETIME_INTERVAL_PRECISION SQLINTEGER ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_DISPLAY_SIZE SQLLEN ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_FIXED_PREC_SCALE SQLSMALLINT ARD: APD inutilizzato: IRD INUTILIZZATO: R IPD: R ARD: AP inutilizzato: Non utilizzato IRD: D IPD: D[1]
SQL_DESC_INDICATOR_PTR SQLLEN * ARD: R/W APD: R/W IRD: IPD INUTILIZZATO: INUTILIZZATO ARD: Null ptr APD: Null ptr IRD: IPD inutilizzato: Non utilizzato
SQL_DESC_LABEL SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_LENGTH SQLULEN ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_LITERAL_PREFIX SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_LITERAL_SUFFIX SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_LOCAL_TYPE_NAME SQLCHAR * ARD: APD inutilizzato: IRD INUTILIZZATO: R IPD: R ARD: AP inutilizzato: Non utilizzato IRD: D IPD: D[1]
SQL_DESC_NAME SQLCHAR * ARD: AP inutilizzato: IRD INUTILIZZATO IPD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_NULLABLE SQLSMALLINT ARD: APD inutilizzato: IRD INUTILIZZATO: R IPD: R ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_NUM_PREC_RADIX SQLINTEGER ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_OCTET_LENGTH SQLLEN ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_OCTET_LENGTH_PTR SQLLEN * ARD: R/W APD: R/W IRD: IPD INUTILIZZATO: INUTILIZZATO ARD: Null ptr APD: Null ptr IRD: IPD inutilizzato: Non utilizzato
SQL_DESC_PARAMETER_TYPE SQLSMALLINT ARD: APD inutilizzato: IRD inutilizzato: IPD inutilizzato: R/W ARD: APD inutilizzato: IRD non utilizzato: IPD inutilizzato: D=SQL_PARAM_INPUT
SQL_DESC_PRECISION SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_ROWVER SQLSMALLINT ARD: Non utilizzato

APD: Inutilizzato

IRD: R

IPD: R
ARD: Non utilizzato

APD: Inutilizzato

IRD: ND

IPD: ND
SQL_DESC_SCALE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_SCHEMA_NAME SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_RICERCABILE SQLSMALLINT ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_TABLE_NAME SQLCHAR * ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato
SQL_DESC_TYPE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: SQL_C_DEFAULT APD: SQL_C_DEFAULT IRD: D IPD: ND
SQL_DESC_TYPE_NAME SQLCHAR * ARD: APD inutilizzato: IRD INUTILIZZATO: R IPD: R ARD: AP inutilizzato: Non utilizzato IRD: D IPD: D[1]
SQL_DESC_UNNAMED SQLSMALLINT ARD: AP inutilizzato: IRD INUTILIZZATO IPD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_UNSIGNED SQLSMALLINT ARD: APD inutilizzato: IRD INUTILIZZATO: R IPD: R ARD: AP inutilizzato: Non utilizzato IRD: D IPD: D[1]
SQL_DESC_UPDATABLE SQLSMALLINT ARD: AP inutilizzato INUTILIZZATO: Inutilizzato IRD: R IPD: Non utilizzato ARD: AP inutilizzato IRD: D IPD: Non utilizzato

[1] Questi campi sono definiti solo quando l'IPD viene automaticamente popolato dal driver. In caso contrario, non sono definiti. Se un'applicazione tenta di impostare questi campi, verrà restituito SQLSTATE HY091 (Identificatore di campo descrittore invalido).

[2] Il campo SQL_DESC_DATA_PTR nell'IPD può essere impostato per forzare un controllo di coerenza. In una successiva chiamata a SQLGetDescField o SQLGetDescRec, il driver non è tenuto a restituire il valore a cui SQL_DESC_DATA_PTR era impostato.

Argomento FieldIdentifier

L'argomento FieldIdentifier indica il campo descrittore da impostare. Un descrittore contiene l'intestazione descrittori, costituita dai campi di intestazione descritti nella sezione successiva, "Campi Header", e zero o più record di descrittore, costituiti dai campi di record descritti nella sezione successiva alla sezione "Header Fields".

Campi di intestazione

Ogni descrittore ha un'intestazione composta dai seguenti campi:

SQL_DESC_ALLOC_TYPE [Tutti]
Questo campo di intestazione SQLSMALLINT di sola lettura specifica se il descrittore è stato allocato automaticamente dal driver o esplicitamente dall'applicazione. L'applicazione può ottenere, ma non modificare, questo campo. Il campo viene impostato come SQL_DESC_ALLOC_AUTO dal conducente se il descrittore è stato assegnato automaticamente dal conducente. Viene impostato come SQL_DESC_ALLOC_USER dal driver se il descrittore è stato esplicitamente assegnato dall'applicazione.

SQL_DESC_ARRAY_SIZE [Descrizioni dell'applicazione]
Negli ARD, questo campo di intestazione SQLULEN specifica il numero di righe nel rowset. Questo è il numero di righe da restituire tramite una chiamata a SQLFetch o SQLFetchScroll o da gestire tramite una chiamata a SQLBulkOperations o SQLSetPos.

Negli APD, questo campo di intestazione SQLULEN specifica il numero di valori per ogni parametro.

Il valore predefinito di questo campo è 1. Se SQL_DESC_ARRAY_SIZE è superiore a 1, SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR e SQL_DESC_OCTET_LENGTH_PTR dell'APD o dell'ARD indicano le matrici. La cardinalità di ogni array è uguale al valore di questo campo.

Questo campo nell'ARD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_ROW_ARRAY_SIZE. Questo campo nell'APD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_PARAMSET_SIZE.

SQL_DESC_ARRAY_STATUS_PTR [Tutti]
Per ogni tipo di descrittore, questo campo di intestazione di SQLUSMALLINT * indica un array di valori di SQLUSMALLINT. Questi array sono denominati come segue: row status array (IRD), parameter status array (IPD), row operation array (ARD) e parameter operation array (APD).

Nell'IRD, questo campo di intestazione punta a un array di stato della riga contenente valori di stato dopo una chiamata a SQLBulkOperations, SQLFetch, SQLFetchScroll o SQLSetPos. L'array ha tanti elementi quanti ne sono nel set di righe. L'applicazione deve allocare un array di SQLUSMALLINT e impostare questo campo per puntare all'array. Il campo è impostato di default su un puntatore nullo. Il driver popolerà l'array - a meno che il campo SQL_DESC_ARRAY_STATUS_PTR non sia impostato su un puntatore nullo, nel qual caso non vengono generati valori di stato e l'array non viene popolato.

Caution

Il comportamento del driver è indefinito se l'applicazione imposta gli elementi dell'array di stato della riga a cui sono stati indicati dal campo SQL_DESC_ARRAY_STATUS_PTR dell'IRD.

L'array viene inizialmente popolato tramite una chiamata a SQLBulkOperations, SQLFetch, SQLFetchScroll o SQLSetPos. Se la chiamata non ha restituito SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, il contenuto dell'array indicato da questo campo è indefinito. Gli elementi nell'array possono contenere i seguenti valori:

  • SQL_ROW_SUCCESS: La fila è stata recuperata con successo e non è cambiata dall'ultima volta che è stata recuperata.

  • SQL_ROW_SUCCESS_WITH_INFO: La fila è stata recuperata con successo e non è cambiata dall'ultima volta che è stata recuperata. Tuttavia, è stato restituito un avviso relativo alla riga.

  • SQL_ROW_ERROR: Si è verificato un errore durante il recupero della fila.

  • SQL_ROW_UPDATED: La riga è stata recuperata con successo ed è stata aggiornata dall'ultima volta che è stata recuperata. Se la riga viene recuperata di nuovo, il suo stato è SQL_ROW_SUCCESS.

  • SQL_ROW_DELETED: La riga è stata cancellata dall'ultima volta che è stata recuperata.

  • SQL_ROW_ADDED: La riga è stata inserita da SQLBulkOperations. Se la riga viene recuperata di nuovo, il suo stato è SQL_ROW_SUCCESS.

  • SQL_ROW_NOROW: Il set di righe si sovrapponeva alla fine dell'insieme dei risultati, e nessuna riga corrispondeva a questo elemento dell'array di stato delle righe.

Questo campo nell'IRD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_ROW_STATUS_PTR.

Il campo SQL_DESC_ARRAY_STATUS_PTR dell'IRD è valido solo dopo che SQL_SUCCESS o SQL_SUCCESS_WITH_INFO sono stati restituiti. Se il codice di ritorno non è uno di questi, la posizione indicata da SQL_DESC_ROWS_PROCESSED_PTR non è definita.

Nell'IPD, questo campo di intestazione punta a un array di stato dei parametri contenente informazioni di stato per ogni insieme di valori di parametro dopo una chiamata a SQLExecute o SQLExecDirect. Se la chiamata a SQLExecute o SQLExecDirect non ha restituito SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, il contenuto dell'array a cui è puntato questo campo non è definito. L'applicazione deve allocare un array di SQLUSMALLINT e impostare questo campo per puntare all'array. Il driver popolerà l'array - a meno che il campo SQL_DESC_ARRAY_STATUS_PTR non sia impostato su un puntatore nullo, nel qual caso non vengono generati valori di stato e l'array non viene popolato. Gli elementi nell'array possono contenere i seguenti valori:

  • SQL_PARAM_SUCCESS: L'istruzione SQL è stata eseguita con successo per questo insieme di parametri.

  • SQL_PARAM_SUCCESS_WITH_INFO: L'istruzione SQL è stata eseguita con successo per questo insieme di parametri; tuttavia, le informazioni di avviso sono disponibili nella struttura dati diagnostica.

  • SQL_PARAM_ERROR: Si è verificato un errore nell'elaborazione di questo insieme di parametri. Ulteriori informazioni sugli errori sono disponibili nella struttura dati diagnostica.

  • SQL_PARAM_UNUSED: Questo set di parametri non era utilizzato, forse perché qualche precedente set di parametri causava un errore che abortiva l'ulteriore elaborazione, oppure perché SQL_PARAM_IGNORE era impostato per quel set di parametri nell'array specificato dal campo SQL_DESC_ARRAY_STATUS_PTR dell'APD.

  • SQL_PARAM_DIAG_UNAVAILABLE: Le informazioni diagnostiche non sono disponibili. Un esempio di ciò è quando il driver tratta array di parametri come un'unità monolitica e quindi non genera questo livello di informazioni di errore.

Questo campo nell'IPD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_PARAM_STATUS_PTR.

Nell'ARD, questo campo di intestazione punta a un array di operazioni di riga di valori che può essere impostato dall'applicazione per indicare se questa riga deve essere ignorata per le operazioni SQLSetPos . Gli elementi nell'array possono contenere i seguenti valori:

  • SQL_ROW_PROCEED: La riga è inclusa nell'operazione di massa usando SQLSetPos. (Questa impostazione non garantisce che l'operazione avvenga sulla riga. Se la riga ha lo status SQL_ROW_ERROR nell'array di stato IRD, il driver potrebbe non essere in grado di eseguire l'operazione nella riga.)

  • SQL_ROW_IGNORE: La riga viene esclusa dall'operazione di blocco tramite SQLSetPos.

Se nessun elemento dell'array è impostato, tutte le righe sono incluse nell'operazione di massa. Se il valore nel campo SQL_DESC_ARRAY_STATUS_PTR dell'ARD è un puntatore nullo, tutte le righe sono incluse nell'operazione di massa; L'interpretazione è la stessa di se il puntatore puntasse a un array valido e tutti gli elementi dell'array fossero SQL_ROW_PROCEED. Se un elemento nell'array è impostato su SQL_ROW_IGNORE, il valore nell'array di stato della riga per la riga ignorata non viene modificato.

Questo campo nell'ARD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_ROW_OPERATION_PTR.

Nell'APD, questo campo di intestazione punta a un array di parametri di valori che può essere impostato dall'applicazione per indicare se questo insieme di parametri deve essere ignorato quando viene chiamato SQLExecute o SQLExecDirect . Gli elementi nell'array possono contenere i seguenti valori:

  • SQL_PARAM_PROCEED: L'insieme di parametri è incluso nella chiamata SQLExecute o SQLExecDirect .

  • SQL_PARAM_IGNORE: L'insieme di parametri è escluso dalla chiamata SQLExecute o SQLExecDirect .

Se nessun elemento dell'array è impostato, tutti i set di parametri dell'array vengono utilizzati nelle chiamate SQLExecute o SQLExecDirect . Se il valore nel campo SQL_DESC_ARRAY_STATUS_PTR dell'APD è un puntatore nullo, si usano tutti gli insiemi di parametri; L'interpretazione è la stessa di se il puntatore puntasse a un array valido e tutti gli elementi dell'array fossero SQL_PARAM_PROCEED.

Questo campo nell'APD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_PARAM_OPERATION_PTR.

SQL_DESC_BIND_OFFSET_PTR [Descrizioni dell'applicazione]
Questo campo di intestazione SQLLEN * punta allo offset di collegamento. È impostato di default su un puntatore nullo. Se questo campo non è un puntatore nullo, il driver derifeziona il puntatore e aggiunge il valore dereferenziato a ciascuno dei campi differiti che ha un valore non nullo nel record descrittore (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR e SQL_DESC_OCTET_LENGTH_PTR) al momento del fetch e utilizza i nuovi valori del puntatore durante l'assegnazione.

L'offset di binding viene sempre aggiunto direttamente ai valori nei campi SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR e SQL_DESC_OCTET_LENGTH_PTR. Se lo offset viene cambiato con un valore diverso, il nuovo valore viene comunque aggiunto direttamente al valore in ogni campo descrittore. Il nuovo offset non viene aggiunto al valore del campo più a qualsiasi offset precedente.

Questo campo è un campo differito: non viene utilizzato al momento in cui viene impostato, ma viene utilizzato successivamente dal driver quando deve determinare gli indirizzi per i data buffer.

Questo campo nell'ARD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_ROW_BIND_OFFSET_PTR. Questo campo nell'ARD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_PARAM_BIND_OFFSET_PTR.

Per maggiori informazioni, consulta la descrizione del binding riga per riga in SQLFetchScroll e SQLBindParameter.

SQL_DESC_BIND_TYPE [Descrizioni dell'applicazione]
Questo campo di intestazione SQLUINTEGER imposta l'orientamento di binding da usare per legare sia colonne che parametri.

Negli ARD, questo campo specifica l'orientamento di binding quando SQLFetchScroll o SQLFetch viene chiamato sull'handle associato all'istruzione.

Per selezionare il binding colonna per colonne, questo campo è impostato su SQL_BIND_BY_COLUMN (il valore predefinito).

Questo campo nell'ARD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_ROW_BIND_TYPE.

Negli APD, questo campo specifica l'orientamento di legame da utilizzare per i parametri dinamici.

Per selezionare il binding colonna per parametri, questo campo è impostato su SQL_BIND_BY_COLUMN (il valore predefinito).

Questo campo nell'APD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_PARAM_BIND_TYPE.

SQL_DESC_COUNT [Tutti]
Questo campo di intestazione SQLSMALLINT specifica l'indice basato su 1 del record con il numero più alto che contiene dati. Quando il driver imposta la struttura dati per il descrittore, deve anche impostare il campo SQL_DESC_COUNT per mostrare quanti record sono significativi. Quando un'applicazione alloca un'istanza di questa struttura dati, non deve specificare per quanti record riservare spazio. Poiché l'applicazione specifica il contenuto dei record, il driver adotta tutte le azioni necessarie per assicurarsi che il handle descrittore si riferisca a una struttura dati di dimensione adeguata.

SQL_DESC_COUNT non è il conteggio di tutte le colonne di dati che sono legate (se il campo è in un ARD) o di tutti i parametri che sono limitati (se il campo è in un APD), ma il numero del record con il numero più alto. Se la colonna o il parametro con il numero più alto è non vincolato, SQL_DESC_COUNT viene cambiato con il numero della colonna o parametro con il numero più alto successivo. Se una colonna o un parametro con un numero inferiore al numero della colonna con il numero più alto è non vincolato (chiamando SQLBindCol con l'argomento TargetValuePtr impostato su puntatore nullo, o SQLBindParameter con l'argomento ParameterValuePtr impostato su puntatore nullo), SQL_DESC_COUNT non viene modificato. Se colonne o parametri aggiuntivi sono assegnati con numeri maggiori del record con il numero più alto che contiene dati, il driver aumenta automaticamente il valore nel campo SQL_DESC_COUNT. Se tutte le colonne sono libere chiamando SQLFreeStmt con l'opzione SQL_UNBIND, i campi SQL_DESC_COUNT nell'ARD e nell'IRD sono impostati a 0. Se SQLFreeStmt viene chiamato con l'opzione SQL_RESET_PARAMS, i campi SQL_DESC_COUNT nell'APD e nell'IPD sono impostati a 0.

Il valore in SQL_DESC_COUNT può essere impostato esplicitamente da un'applicazione chiamando SQLSetDescField. Se il valore in SQL_DESC_COUNT viene esplicitamente diminuito, tutti i record con numeri maggiori del nuovo valore in SQL_DESC_COUNT vengono effettivamente rimossi. Se il valore in SQL_DESC_COUNT è esplicitamente impostato a 0 e il campo è in un ARD, tutti i buffer dati tranne una colonna di segnalibri vincolati vengono rilasciati.

Il conteggio dei record in questo campo di un ARD non include una colonna di segnalibri rilegata. L'unico modo per delegare una colonna dei segnalibri è impostare il campo SQL_DESC_DATA_PTR su un puntatore nullo.

SQL_DESC_ROWS_PROCESSED_PTR [Descrittori di implementazione]
In un IRD, questo campo di intestazione di SQLULEN * punta a un buffer contenente il numero di righe recuperate dopo una chiamata a SQLFetch o SQLFetchScroll, o il numero di righe interessate in un'operazione di massa eseguita da una chiamata a SQLBulkOperations o SQLSetPos, incluse le righe di errore.

In un IPD, questo campo di intestazione * di SQLUINTEGER punta a un buffer contenente il numero di insiemi di parametri elaborati, inclusi gli insiemi di errori. Nessun numero verrà restituito se questo è un puntatore nullo.

SQL_DESC_ROWS_PROCESSED_PTR è valido solo dopo che SQL_SUCCESS o SQL_SUCCESS_WITH_INFO sono stati restituiti a seguito di una chiamata a SQLFetch o SQLFetchScroll (per un campo IRD) o SQLExecute, SQLExecDirect o SQLParamData (per un campo IPD). Se la chiamata che riempie il buffer indicato da questo campo non restituisce SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, il contenuto del buffer è indefinito, a meno che non restituisca SQL_NO_DATA, nel qual caso il valore nel buffer è impostato a 0.

Questo campo nell'ARD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_ROWS_FETCHED_PTR. Questo campo nell'APD può anche essere impostato chiamando SQLSetStmtAttr con l'attributo SQL_ATTR_PARAMS_PROCESSED_PTR.

Il buffer indicato da questo campo viene allocato dall'applicazione. È un buffer di uscita differito impostato dal driver. È impostato di default su un puntatore nullo.

Campi da record

Ogni descrittore contiene uno o più record costituiti da campi che definiscono dati di colonna o parametri dinamici, a seconda del tipo di descrittore. Ogni record è una definizione completa di una singola colonna o parametro.

SQL_DESC_AUTO_UNIQUE_VALUE [IRD]
Questo campo di record SQLINTEGER di sola lettura contiene SQL_TRUE se la colonna è una colonna con auto-incremento, o SQL_FALSE se la colonna non è una colonna con auto-incremento. Questo campo è di sola lettura, ma la colonna sottostante di auto-incremento non è necessariamente di sola lettura.

SQL_DESC_BASE_COLUMN_NAME [IRD]
Questo campo di registrazione SQLCHAR * di sola lettura contiene il nome della colonna base per la colonna dell'insieme dei risultati. Se un nome di colonna base non esiste (come nel caso delle colonne che sono espressioni), questa variabile contiene una stringa vuota.

SQL_DESC_BASE_TABLE_NAME [IRD]
Questo campo di registrazione SQLCHAR * di sola lettura contiene il nome base della tabella per la colonna del set dei risultati. Se un nome di tabella base non può essere definito o non è applicabile, questa variabile contiene una stringa vuota.

SQL_DESC_CASE_SENSITIVE [Descrizioni di implementazione]
Questo campo di record SQLINTEGER di sola lettura contiene SQL_TRUE se la colonna o il parametro è trattato come maiuscolo-sensitivo per colazioni e confronti, o SQL_FALSE se la colonna non è trattata come contro-maiuscole per collazioni e confronti o se è una colonna non caratteristica.

SQL_DESC_CATALOG_NAME [IRD]
Questo campo di registrazione SQLCHAR * di sola lettura contiene il catalogo della tabella base che contiene la colonna. Il valore di ritorno dipende dal driver se la colonna è un'espressione o se la colonna fa parte di una vista. Se la sorgente dati non supporta i cataloghi o il catalogo non può essere determinato, questa variabile contiene una stringa vuota.

SQL_DESC_CONCISE_TYPE [Tutti]
Questo campo di intestazione SQLSMALLINT specifica il tipo di dato conciso per tutti i tipi di dati, inclusi i tipi di data, ora e intervallo.

I valori nei campi SQL_DESC_CONCISE_TYPE, SQL_DESC_TYPE e SQL_DESC_DATETIME_INTERVAL_CODE sono interdipendenti. Ogni volta che uno dei campi è impostato, anche l'altro deve essere impostato. SQL_DESC_CONCISE_TYPE può essere impostata tramite una chiamata a SQLBindCol o SQLBindParameter, o SQLSetDescField. SQL_DESC_TYPE può essere impostato tramite una chiamata a SQLSetDescField o SQLSetDescRec.

Se SQL_DESC_CONCISE_TYPE è impostato su un tipo di dato conciso diverso da un tipo di dato intervallo o datatime, il campo SQL_DESC_TYPE è impostato allo stesso valore e il campo SQL_DESC_DATETIME_INTERVAL_CODE è impostato a 0.

Se SQL_DESC_CONCISE_TYPE è impostato sul tipo dati-orario conciso o intervallo, il campo SQL_DESC_TYPE viene impostato sul corrispondente tipo verboso (SQL_DATETIME o SQL_INTERVAL) e il campo SQL_DESC_DATETIME_INTERVAL_CODE è impostato sul sottocodice appropriato.

SQL_DESC_DATA_PTR [Descrizioni dell'applicazione e IPD]
Questo campo di record SQLPOINTER punta a una variabile che conterrà il valore del parametro (per gli APD) o il valore della colonna (per gli ARD). Questo campo è un campo differito. Non viene utilizzato al momento dell'impostazione, ma viene utilizzato successivamente dal driver per recuperare i dati.

La colonna specificata dal campo SQL_DESC_DATA_PTR dell'ARD è non vincolata se l'argomento TargetValuePtr in una chiamata a SQLBindCol è un puntatore nullo o se il campo SQL_DESC_DATA_PTR nell'ARD è impostato da una chiamata a SQLSetDescField o SQLSetDescRec a un puntatore nullo. Altri campi non sono interessati se il campo SQL_DESC_DATA_PTR è impostato su un puntatore nullo.

Se la chiamata a SQLFetch o SQLFetchScroll che riempie il buffer indicato da questo campo non restituisce SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, il contenuto del buffer è indefinito.

Ogni volta che il campo SQL_DESC_DATA_PTR di un APD, ARD o IPD è impostato, il driver verifica che il valore nel campo SQL_DESC_TYPE contenga uno dei tipi di dati ODBC C validi o un tipo di dato specifico del driver, e che tutti gli altri campi che influenzano i tipi di dati siano coerenti. Avviare un controllo di coerenza è l'unico utilizzo del campo SQL_DESC_DATA_PTR di un IPD. In particolare, se un'applicazione imposta il campo SQL_DESC_DATA_PTR di un IPD e successivamente chiama SQLGetDescField su questo campo, non viene necessariamente restituito il valore che aveva impostato. Per ulteriori informazioni, vedi "Controlli di coerenza" in SQLSetDescRec.

SQL_DESC_DATETIME_INTERVAL_CODE [Tutti]
Questo campo di record SQLSMALLINT contiene il sottocodice per il tipo di data o intervallo specifico quando il campo SQL_DESC_TYPE è SQL_DATETIME o SQL_INTERVAL. Questo vale sia per i tipi di dati SQL che per quelli C. Il codice consiste nel nome del tipo di dati con "CODE" sostituito al posto di "TYPE" o "C_TYPE" (per i tipi di datatime), oppure "CODE" sostituito a "INTERVAL" o "C_INTERVAL" (per i tipi di intervallo).

Se SQL_DESC_TYPE e SQL_DESC_CONCISE_TYPE in un descrittore applicativo sono impostati su SQL_C_DEFAULT e il descrittore non è associato a un handle di istruzione, il contenuto di SQL_DESC_DATETIME_INTERVAL_CODE non è definito.

Questo campo può essere impostato per i tipi di dati datatime elencati nella tabella seguente.

Tipi di datatime DATETIME_INTERVAL_CODE
SQL_TYPE_DATE/SQL_C_TYPE_DATE SQL_CODE_DATE
SQL_TYPE_TIME/SQL_C_TYPE_TIME SQL_CODE_TIME
SQL_TYPE_TIMESTAMP/ SQL_C_TYPE_TIMESTAMP SQL_CODE_TIMESTAMP

Questo campo può essere impostato per i tipi di dati intervalli elencati nella tabella seguente.

Tipo di intervallo DATETIME_INTERVAL_CODE
SQL_INTERVAL_DAY/ SQL_C_INTERVAL_DAY SQL_CODE_DAY
SQL_INTERVAL_DAY_TO_HOUR/ SQL_C_INTERVAL_DAY_TO_HOUR SQL_CODE_DAY_TO_HOUR
SQL_INTERVAL_DAY_TO_MINUTE/ SQL_C_INTERVAL_DAY_TO_MINUTE SQL_CODE_DAY_TO_MINUTE
SQL_INTERVAL_DAY_TO_SECOND/ SQL_C_INTERVAL_DAY_TO_SECOND SQL_CODE_DAY_TO_SECOND
SQL_INTERVAL_HOUR/ SQL_C_INTERVAL_HOUR SQL_CODE_HOUR
SQL_INTERVAL_HOUR_TO_MINUTE/ SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_CODE_HOUR_TO_MINUTE
SQL_INTERVAL_HOUR_TO_SECOND/ SQL_C_INTERVAL_HOUR_TO_SECOND SQL_CODE_HOUR_TO_SECOND
SQL_INTERVAL_MINUTE/ SQL_C_INTERVAL_MINUTE SQL_CODE_MINUTE
SQL_INTERVAL_MINUTE_TO_SECOND/ SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_CODE_MINUTE_TO_SECOND
SQL_INTERVAL_MONTH/ SQL_C_INTERVAL_MONTH SQL_CODE_MONTH
SQL_INTERVAL_SECOND/ SQL_C_INTERVAL_SECOND SQL_CODE_SECOND
SQL_INTERVAL_YEAR/ SQL_C_INTERVAL_YEAR SQL_CODE_YEAR
SQL_INTERVAL_YEAR_TO_MONTH/ SQL_C_INTERVAL_YEAR_TO_MONTH SQL_CODE_YEAR_TO_MONTH

Per maggiori informazioni sugli intervalli dati e su questo campo, vedi Identificatori e Descrittori di Tipo di Dati.

SQL_DESC_DATETIME_INTERVAL_PRECISION [Tutti]
Questo campo di record SQLINTEGER contiene la precisione che guida l'intervallo se il campo SQL_DESC_TYPE è SQL_INTERVAL. Quando il campo SQL_DESC_DATETIME_INTERVAL_CODE è impostato su un tipo di dato a intervallo, questo campo viene impostato sulla precisione predefinita che guida l'intervallo.

SQL_DESC_DISPLAY_SIZE [IRD]
Questo campo di record SQLINTEGER di sola lettura contiene il numero massimo di caratteri necessari per visualizzare i dati della colonna.

SQL_DESC_FIXED_PREC_SCALE [Descrizioni di implementazione]
Questo campo di registrazione SQLSMALLINT di sola lettura è impostato su SQL_TRUE se la colonna è una colonna numerica esatta e ha una precisione fissa e una scala non nulla, oppure su SQL_FALSE se la colonna non è una colonna numerica esatta con precisione e scala fisse.

SQL_DESC_INDICATOR_PTR [Descrizioni dell'applicazione]
Negli ARD, questo campo di registrazione SQLLEN * punta alla variabile indicatore. Questa variabile contiene SQL_NULL_DATA se il valore della colonna è un NULL. Per gli APD, la variabile indicatore è impostata per SQL_NULL_DATA specificare gli argomenti dinamici NULL. Altrimenti, la variabile è zero (a meno che i valori in SQL_DESC_INDICATOR_PTR e SQL_DESC_OCTET_LENGTH_PTR non siano lo stesso puntatore).

Se il campo SQL_DESC_INDICATOR_PTR in un ARD è un puntatore nullo, il driver è impedito di restituire informazioni sul fatto che la colonna sia NULL o meno. Se la colonna è NULL e SQL_DESC_INDICATOR_PTR è un puntatore nullo, SQLSTATE 22002 (variabile indicatrice richiesta ma non fornita) viene restituito quando il driver tenta di popolare il buffer dopo una chiamata a SQLFetch o SQLFetchScroll. Se la chiamata a SQLFetch o SQLFetchScroll non ha restituito SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, il contenuto del buffer è indefinito.

Il campo SQL_DESC_INDICATOR_PTR determina se il campo indicato da SQL_DESC_OCTET_LENGTH_PTR è definito. Se il valore dei dati di una colonna è NULL, il driver imposta la variabile indicatore su SQL_NULL_DATA. Il campo indicato da SQL_DESC_OCTET_LENGTH_PTR non è quindi impostato. Se non si trova un valore NULL durante il fetch, il buffer puntato da SQL_DESC_INDICATOR_PTR viene impostato a zero e il buffer puntato da SQL_DESC_OCTET_LENGTH_PTR è impostato alla lunghezza dei dati.

Se il campo SQL_DESC_INDICATOR_PTR in un APD è un puntatore nullo, l'applicazione non può usare questo record descrittore per specificare argomenti NULL.

Questo campo è un campo differito: non viene usato al momento in cui viene impostato, ma viene usato successivamente dal driver per indicare la nullità (per gli ARD) o per determinare la nullità (per gli APD).

SQL_DESC_LABEL [IRD]
Questo campo di registrazione SQLCHAR * di sola lettura contiene l'etichetta della colonna o il titolo. Se la colonna non ha un'etichetta, questa variabile contiene il nome della colonna. Se la colonna è senza nome e non etichettata, questa variabile contiene una stringa vuota.

SQL_DESC_LENGTH [Tutti]
Questo campo di record SQLULEN è o la lunghezza massima o effettiva di una stringa di caratteri in caratteri o un tipo di dato binario in byte. È la lunghezza massima per un tipo di dato a lunghezza fissa, o la lunghezza effettiva per un tipo di dato a lunghezza variabile. Il suo valore esclude sempre il carattere di terminazione nulla che termina la stringa di caratteri. Per valori il cui tipo è SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP o uno dei tipi di dati intervalli SQL, questo campo contiene la lunghezza in caratteri della rappresentazione della stringa di caratteri del valore datatimetime o intervallo.

Il valore in questo campo può essere diverso dal valore per "lunghezza" come definito in ODBC 2*.x*. Per ulteriori informazioni, vedi l'Appendice D: Tipi di dati.

SQL_DESC_LITERAL_PREFIX [IRDs]
Questo campo di registrazione SQLCHAR * di sola lettura contiene il carattere o i caratteri che il driver riconosce come prefisso per un letterale di questo tipo di dato. Questa variabile contiene una stringa vuota per un tipo di dato per il quale un prefisso letterale non è applicabile.

SQL_DESC_LITERAL_SUFFIX [IRDs]
Questo campo di registrazione SQLCHAR * di sola lettura contiene il carattere o i caratteri che il driver riconosce come suffisso per un letterale di questo tipo di dato. Questa variabile contiene una stringa vuota per un tipo di dato per il quale non è applicabile un suffisso letterale.

SQL_DESC_LOCAL_TYPE_NAME [Descrizioni di implementazione]
Questo campo di record SQLCHAR * in sola lettura contiene qualsiasi nome localizzato (lingua madre) per il tipo di dato che può differire dal nome normale del tipo di dato. Se non c'è un nome localizzato, viene restituita una stringa vuota. Questo campo è solo a scopo di visualizzazione.

SQL_DESC_NAME [Descrizioni di implementazione]
Questo campo di record SQLCHAR * in un descrittore di riga contiene l'alias della colonna, se applicabile. Se l'alias della colonna non si applica, il nome della colonna viene restituito. In entrambi i casi, il driver imposta il campo SQL_DESC_UNNAMED su SQL_NAMED quando imposta il campo SQL_DESC_NAME. Se non c'è nome di colonna o alias di colonna, il driver restituisce una stringa vuota nel campo SQL_DESC_NAME e imposta il campo SQL_DESC_UNNAMED su SQL_UNNAMED.

Un'applicazione può impostare il campo SQL_DESC_NAME di un IPD su un nome o un alias per specificare i parametri della stored procedure per nome. (Per maggiori informazioni, vedi Parametri di Collegamento per Nome (Parametri Nominati).) Il campo SQL_DESC_NAME di un IRD è un campo di sola lettura; SQLSTATE HY091 (Identificatore di campo descrittore invalido) verrà restituito se un'applicazione tenta di impostarlo.

Negli IPD, questo campo è indefinito se il driver non supporta parametri nominati. Se il driver supporta parametri nominati ed è in grado di descrivere parametri, il nome del parametro viene restituito in questo campo.

SQL_DESC_NULLABLE [Descrizioni di implementazione]
Negli IRD, questo campo di record SQLSMALLINT di sola lettura è SQL_NULLABLE se la colonna può avere valori NULL, SQL_NO_NULLS se la colonna non ha valori NULL, o SQL_NULLABLE_UNKNOWN se non si sa se la colonna accetta valori NULL. Questo campo riguarda la colonna dell'insieme dei risultati, non la colonna base.

Negli IPD, questo campo è sempre impostato su SQL_NULLABLE perché i parametri dinamici sono sempre nullabili e non possono essere impostati da un'applicazione.

SQL_DESC_NUM_PREC_RADIX [Tutti]
Questo campo SQLINTEGER contiene un valore di 2 se il tipo di dato nel campo SQL_DESC_TYPE è un tipo di dato numerico approssimato, perché il campo SQL_DESC_PRECISION contiene il numero di bit. Questo campo contiene un valore di 10 se il tipo di dato nel campo SQL_DESC_TYPE è un tipo numerico esatto, perché il campo SQL_DESC_PRECISION contiene il numero di cifre decimali. Questo campo è impostato a 0 per tutti i tipi di dati non numerici.

SQL_DESC_OCTET_LENGTH [Tutti]
Questo campo di record SQLLEN contiene la lunghezza, in byte, di una stringa di caratteri o di un tipo di dato binario. Per caratteri a lunghezza fissa o tipi binari, questa è la lunghezza effettiva in byte. Per caratteri a lunghezza variabile o tipi binari, questa è la lunghezza massima in byte. Questo valore esclude sempre spazio per il carattere di terminazione nulla per i descrittori di implementazione e include sempre spazio per il carattere di terminazione nulla per i descrittori applicativo. Per i dati applicativi, questo campo contiene la dimensione del buffer. Per gli APD, questo campo è definito solo per parametri di uscita o input/output.

SQL_DESC_OCTET_LENGTH_PTR [Descrizioni dell'applicazione]
Questo campo di record SQLLEN * indica una variabile che conterrà la lunghezza totale in byte di un argomento dinamico (per i descrittori di parametro) o di un valore di colonna limitato (per i descrittori di righe).

Per un APD, questo valore viene ignorato per tutti gli argomenti tranne la stringa di caratteri e il binario; se questo campo punta a SQL_NTS, l'argomento dinamico deve essere terminato in nullo. Per indicare che un parametro vincolato sarà un parametro data-at-execution, un'applicazione imposta questo campo nel record appropriato dell'APD a una variabile che, al momento dell'esecuzione, conterrà il valore SQL_DATA_AT_EXEC o il risultato della macro SQL_LEN_DATA_AT_EXEC. Se ci sono più di un campo di questo tipo, SQL_DESC_DATA_PTR può essere impostato su un valore che identifica in modo univoco il parametro per aiutare l'applicazione a determinare quale parametro viene richiesto.

Se il campo OCTET_LENGTH_PTR di un ARD è un puntatore nullo, il driver non restituisce informazioni sulla lunghezza della colonna. Se il campo SQL_DESC_OCTET_LENGTH_PTR di un APD è un puntatore nullo, il driver assume che le stringhe di caratteri e i valori binari siano terminati a nullo. (I valori binari non dovrebbero essere terminati a nulla ma dovrebbero avere una lunghezza per evitare troncamento.)

Se la chiamata a SQLFetch o SQLFetchScroll che riempie il buffer indicato da questo campo non restituisce SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, il contenuto del buffer è indefinito. Questo campo è un campo differito. Non viene utilizzato al momento dell'impostazione, ma viene utilizzato successivamente dal driver per determinare o indicare la lunghezza dell'ottetto dei dati.

SQL_DESC_PARAMETER_TYPE [IPD]
Questo campo di record SQLSMALLINT è impostato su SQL_PARAM_INPUT per un parametro di input, SQL_PARAM_INPUT_OUTPUT per un parametro input/output, SQL_PARAM_OUTPUT per un parametro di output, SQL_PARAM_INPUT_OUTPUT_STREAM per un parametro in streaming in input/output o SQL_PARAM_OUTPUT_STREAM per un parametro in streaming in output. È impostato su SQL_PARAM_INPUT di default.

Per un IPD, il campo è impostato su SQL_PARAM_INPUT di default se l'IPD non viene automaticamente popolato dal driver (l'attributo dell'istruzione SQL_ATTR_ENABLE_AUTO_IPD è SQL_FALSE). Un'applicazione dovrebbe impostare questo campo nell'IPD per parametri che non sono parametri di input.

SQL_DESC_PRECISION [Tutti]
Questo campo di record SQLSMALLINT contiene il numero di cifre per un tipo numerico esatto, il numero di bit nella mantissa (precisione binaria) per un tipo numerico approssimativo, o il numero di cifre nella componente dei secondi frazionari per il tipo di dato SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP o SQL_INTERVAL_SECOND. Questo campo non è definito per tutti gli altri tipi di dati.

Il valore in questo campo può essere diverso dal valore per la "precisione" come definito in ODBC 2*.x*. Per ulteriori informazioni, vedi l'Appendice D: Tipi di dati.

SQL_DESC_ROWVER [Descrizioni di implementazione]
Questo campo SQLSMALLINTrecord indica se una colonna viene automaticamente modificata dal DBMS quando una riga viene aggiornata (ad esempio, una colonna del tipo "timestamp" in SQL Server). Il valore di questo campo record è impostato a SQL_TRUE se la colonna è una colonna di versionamento riga, e a SQL_FALSE altrimenti. Questo attributo di colonna è simile a chiamare SQLSpecialColumns con IdentifierType di SQL_ROWVER per determinare se una colonna viene aggiornata automaticamente.

SQL_DESC_SCALE [Tutti]
Questo campo di record SQLSMALLINT contiene la scala definita per tipi di dati decimali e numerici. Il campo è indefinito per tutti gli altri tipi di dati.

Il valore in questo campo può essere diverso dal valore per la "scala" come definito in ODBC 2*.x*. Per ulteriori informazioni, vedi l'Appendice D: Tipi di dati.

SQL_DESC_SCHEMA_NAME [IRD]
Questo campo di registrazione SQLCHAR * in sola lettura contiene il nome dello schema della tabella base che contiene la colonna. Il valore di ritorno dipende dal driver se la colonna è un'espressione o se la colonna fa parte di una vista. Se la sorgente dati non supporta gli schemi o il nome dello schema non può essere determinato, questa variabile contiene una stringa vuota.

SQL_DESC_SEARCHABLE [IRDs]
Questo campo di registrazione SQLSMALLINT di sola lettura è impostato su uno dei seguenti valori:

  • SQL_PRED_NONE se la colonna non può essere usata in una clausola WHERE . (Questo è lo stesso valore di SQL_UNSEARCHABLE in ODBC 2*.x*.)

  • SQL_PRED_CHAR se la colonna può essere usata in una clausola WHERE ma solo con il predicato LIKE . (Questo è lo stesso valore di SQL_LIKE_ONLY in ODBC 2*.x*.)

  • SQL_PRED_BASIC se la colonna può essere usata in una clausola WHERE con tutti gli operatori di confronto tranne LIKE. (Questo è lo stesso valore di SQL_EXCEPT_LIKE in ODBC 2*.x*.)

  • SQL_PRED_SEARCHABLE se la colonna può essere usata in una clausola WHERE con qualsiasi operatore di confronto.

SQL_DESC_TABLE_NAME [IRD]
Questo campo di registrazione SQLCHAR * di sola lettura contiene il nome della tabella base che contiene questa colonna. Il valore di ritorno dipende dal driver se la colonna è un'espressione o se la colonna fa parte di una vista.

SQL_DESC_TYPE [Tutti]
Questo campo di record SQLSMALLINT specifica il tipo di dato SQL o C conciso per tutti i tipi di dati tranne data, ora e intervallo. Per i tipi di dati data-ora e intervallo, questo campo specifica il tipo di dato verboso, che è SQL_DATETIME o SQL_INTERVAL.

Ogni volta che questo campo contiene SQL_DATETIME o SQL_INTERVAL, il campo SQL_DESC_DATETIME_INTERVAL_CODE deve contenere il sottocodice appropriato per il tipo conciso. Per i tipi di dati datatime, SQL_DESC_TYPE contiene SQL_DATETIME, e il campo SQL_DESC_DATETIME_INTERVAL_CODE contiene un sottocodice per il tipo specifico di data timetime. Per i tipi di dati a intervallo, SQL_DESC_TYPE contiene SQL_INTERVAL e il campo SQL_DESC_DATETIME_INTERVAL_CODE contiene un sottocodice per il tipo di dato intervallo specifico.

I valori nei campi SQL_DESC_TYPE e SQL_DESC_CONCISE_TYPE sono interdipendenti. Ogni volta che uno dei campi è impostato, anche l'altro deve essere impostato. SQL_DESC_TYPE può essere impostato tramite una chiamata a SQLSetDescField o SQLSetDescRec. SQL_DESC_CONCISE_TYPE può essere impostata tramite una chiamata a SQLBindCol o SQLBindParameter, o SQLSetDescField.

Se SQL_DESC_TYPE è impostato su un tipo di dato conciso diverso da un tipo di dato intervallo o datatime, il campo SQL_DESC_CONCISE_TYPE è impostato allo stesso valore e il campo SQL_DESC_DATETIME_INTERVAL_CODE è impostato a 0.

Se SQL_DESC_TYPE è impostato sul tipo data-time o intervallo (SQL_DATETIME o SQL_INTERVAL) e il campo SQL_DESC_DATETIME_INTERVAL_CODE è impostato sul sottocodice appropriato, il campo SQL_DESC_CONCISE TYPE è impostato sul tipo corrispondente e conciso. Provando a impostare SQL_DESC_TYPE su uno dei tipi concisi di data, ora o intervallo restituirà SQLSTATE HY021 (Informazione descrittiva inconsistente).

Quando il campo SQL_DESC_TYPE viene impostato tramite una chiamata a SQLBindCol, SQLBindParameter o SQLSetDescField, i seguenti campi sono impostati ai seguenti valori predefiniti, come mostrato nella tabella sottostante. I valori dei campi rimanenti dello stesso record non sono definiti.

Valore della SQL_DESC_TYPE Altri campi implicitamente insettati
SQL_CHAR, SQL_VARCHAR, SQL_C_CHAR, SQL_C_VARCHAR SQL_DESC_LENGTH è impostato su 1. SQL_DESC_PRECISION è impostato a 0.
SQL_DATETIME Quando SQL_DESC_DATETIME_INTERVAL_CODE è impostato su SQL_CODE_DATE o SQL_CODE_TIME, SQL_DESC_PRECISION è impostato su 0. Quando è impostato su SQL_DESC_TIMESTAMP, SQL_DESC_PRECISION è impostato su 6.
SQL_DECIMAL, SQL_NUMERIC, SQL_C_NUMERIC SQL_DESC_SCALE è impostato a 0. SQL_DESC_PRECISION è impostato sulla precisione definita dall'implementazione per il rispettivo tipo di dato.

Vedi SQL to C: Numeric per informazioni su come associare manualmente un valore SQL_C_NUMERIC.
SQL_FLOAT, SQL_C_FLOAT SQL_DESC_PRECISION è impostato sulla precisione predefinita definita dall'implementazione per SQL_FLOAT.
SQL_INTERVAL Quando SQL_DESC_DATETIME_INTERVAL_CODE è impostato su un tipo di dato a intervallo, SQL_DESC_DATETIME_INTERVAL_PRECISION è impostato a 2 (la precisione predefinita di apertura dell'intervallo). Quando l'intervallo ha una componente dei secondi, SQL_DESC_PRECISION è impostato a 6 (la precisione predefinita dei secondi intervalli).

Quando un'applicazione chiama SQLSetDescField per impostare campi di un descrittore invece di chiamare SQLSetDescRec, l'applicazione deve prima dichiarare il tipo di dato. Quando lo fa, gli altri campi indicati nella tabella precedente sono implicitamente impostati. Se uno qualsiasi dei valori implicitamente imposti è inaccettabile, l'applicazione può chiamare SQLSetDescField o SQLSetDescRec per impostare esplicitamente il valore inaccettabile.

SQL_DESC_TYPE_NAME [Descrizioni di implementazione]
Questo campo di record SQLCHAR * di sola lettura contiene il nome del tipo dipendente dalla sorgente dati (ad esempio, "CHAR", "VARCHAR" e così via). Se il nome del tipo di dato è sconosciuto, questa variabile contiene una stringa vuota.

SQL_DESC_UNNAMED [Descrizioni di implementazione]
Questo campo di registrazione SQLSMALLINT in un descrittore di riga viene impostato dal driver su SQL_NAMED o SQL_UNNAMED quando imposta il campo SQL_DESC_NAME. Se il campo SQL_DESC_NAME contiene un alias di colonna o se l'alias di colonna non si applica, il driver imposta il campo SQL_DESC_UNNAMED su SQL_NAMED. Se un'applicazione imposta il campo SQL_DESC_NAME di un IPD su un nome o un alias di parametro, il driver imposta il campo SQL_DESC_UNNAMED dell'IPD su SQL_NAMED. Se non c'è nome di colonna né alias di colonna, il driver imposta il campo SQL_DESC_UNNAMED su SQL_UNNAMED.

Un'applicazione può impostare il campo SQL_DESC_UNNAMED di un IPD su SQL_UNNAMED. Un driver restituisce SQLSTATE HY091 (identificatore di campo descrittore invalido) se un'applicazione tenta di impostare il campo SQL_DESC_UNNAMED di un IPD su SQL_NAMED. Il campo SQL_DESC_UNNAMED di un IRD è di sola lettura; SQLSTATE HY091 (Identificatore di campo descrittore invalido) verrà restituito se un'applicazione tenta di impostarlo.

SQL_DESC_UNSIGNED [Descrizioni di implementazione]
Questo campo di registrazione SQLSMALLINT di sola lettura è impostato su SQL_TRUE se il tipo di colonna è non firmato o non numerico, oppure SQL_FALSE se il tipo di colonna è firmato.

SQL_DESC_UPDATABLE [IRD]
Questo campo di registrazione SQLSMALLINT di sola lettura è impostato su uno dei seguenti valori:

  • SQL_ATTR_READ_ONLY se la colonna dell'insieme dei risultati è di sola lettura.

  • SQL_ATTR_WRITE se la colonna dell'insieme dei risultati è di lettura-scrittura.

  • SQL_ATTR_READWRITE_UNKNOWN se non si sa se la colonna dell'insieme dei risultati sia aggiornabile o meno.

SQL_DESC_UPDATABLE descrive l'aggiornabilità della colonna nell'insieme dei risultati, non la colonna nella tabella base. L'aggiornabilità della colonna nella tabella base su cui si basa questa colonna dell'insieme di risultati può essere diversa dal valore in questo campo. Se una colonna sia aggiornabile può dipendere dal tipo di dato, dai privilegi utente e dalla definizione stessa del set di risultati. Se non è chiaro se una colonna sia aggiornabile, SQL_ATTR_READWRITE_UNKNOWN dovrebbe essere restituita.

Controlli di coerenza

Un controllo di coerenza viene eseguito automaticamente dal driver ogni volta che un'applicazione invia un valore per il campo SQL_DESC_DATA_PTR dell'ARD, APD o IPD. Se uno dei campi è incoerente con altri campi, SQLSetDescField restituirà SQLSTATE HY021 (Informazione descrittiva incoerente). Per ulteriori informazioni, vedi "Controllo di coerenza" in SQLSetDescRec.

Per informazioni su Vedi
Legare una colonna Funzione SQLBindCol
Legare un parametro Funzione SQLBindParameter
Ottenere un campo descrittore Funzione SQLGetDescField
Ottenere più campi descrittori Funzione SQLGetDescRec
Impostazione di campi descrittori multipli Funzione SQLSetDescRec

Vedere anche

File di intestazione ODBC
Riferimento API ODBC