Funzione SQLColAttribute
Conformità
Versione introdotta: Conformità agli standard ODBC 3.0: ISO 92
Riepilogo
SQLColAttribute restituisce informazioni sul descrittore per una colonna in un set di risultati. Le informazioni sul descrittore vengono restituite come stringa di caratteri, un valore dipendente dal descrittore o un valore intero.
Nota
Per altre informazioni su ciò che Gestione driver esegue il mapping di questa funzione a quando un ODBC 3.L'applicazione x funziona con odbc 2.x driver, vedere Mapping di funzioni di sostituzione per la compatibilità con le versioni precedenti delle applicazioni.
Sintassi
SQLRETURN SQLColAttribute (
SQLHSTMT StatementHandle,
SQLUSMALLINT ColumnNumber,
SQLUSMALLINT FieldIdentifier,
SQLPOINTER CharacterAttributePtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr,
SQLLEN * NumericAttributePtr);
Argomenti
StatementHandle
[Input] Handle di istruzione.
ColumnNumber
[Input] Numero del record nell'IRD da cui recuperare il valore del campo. Questo argomento corrisponde al numero di colonne dei dati dei risultati, ordinato in sequenza in ordine di colonna crescente, a partire da 1. Le colonne possono essere descritte in qualsiasi ordine.
La colonna 0 può essere specificata in questo argomento, ma tutti i valori tranne SQL_DESC_TYPE e SQL_DESC_OCTET_LENGTH restituiranno valori non definiti.
FieldIdentifier
[Input] Handle del descrittore. Questo handle definisce il campo in cui deve essere eseguita una query in IRD, ad esempio SQL_COLUMN_TABLE_NAME.
CharacterAttributePtr
[Output] Puntatore a un buffer in cui restituire il valore nel campo FieldIdentifier della riga ColumnNumber dell'IRD, se il campo è una stringa di caratteri. In caso contrario, il campo non è usato.
Se CharacterAttributePtr è NULL, StringLengthPtr restituirà comunque il numero totale di byte (escluso il carattere di terminazione Null per i dati di tipo carattere) da restituire nel buffer a cui punta CharacterAttributePtr.
BufferLength
[Input] Se FieldIdentifier è un campo definito da ODBC e CharacterAttributePtr punta a una stringa di caratteri o a un buffer binario, questo argomento deve essere la lunghezza di *CharacterAttributePtr. Se FieldIdentifier è un campo definito da ODBC e *CharacterAttributePtr è un numero intero, questo campo viene ignorato. Se * CharacterAttributePtr è una stringa Unicode (quando si chiama SQLColAttributeW), l'argomento BufferLength deve essere un numero pari. Se FieldIdentifier è un campo definito dal driver, l'applicazione indica la natura del campo in Gestione driver impostando l'argomento BufferLength .
BufferLength può avere i valori seguenti:
Se CharacterAttributePtr è un puntatore a un puntatore, BufferLength deve avere il valore SQL_IS_POINTER.
Se CharacterAttributePtr è un puntatore a una stringa di caratteri, BufferLength è la lunghezza del buffer.
Se CharacterAttributePtr è un puntatore a un buffer binario, l'applicazione inserisce il risultato della macro SQL_LEN_BINARY_ATTR(length) in BufferLength. In questo modo viene impostato un valore negativo in BufferLength.
Se CharacterAttributePtr è un puntatore a un tipo di dati a lunghezza fissa, BufferLength deve essere uno dei seguenti: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT o SQL_IS_USMALLINT.
StringLengthPtr
[Output] Puntatore a un buffer in cui restituire il numero totale di byte (escluso il byte di terminazione Null per i dati di tipo carattere) da restituire in *CharacterAttributePtr.
Per i dati di tipo carattere, se il numero di byte disponibili per la restituzione è maggiore o uguale a BufferLength, le informazioni del descrittore in *CharacterAttributePtr vengono troncate a BufferLength meno la lunghezza di un carattere di terminazione Null e terminano con null dal driver.
Per tutti gli altri tipi di dati, il valore di BufferLength viene ignorato e il driver presuppone che le dimensioni di *CharacterAttributePtr siano di 32 bit.
NumericAttributePtr
[Output] Puntatore a un buffer intero in cui restituire il valore nel campo FieldIdentifier della riga ColumnNumber dell'IRD, se il campo è un tipo di descrittore numerico, ad esempio SQL_DESC_COLUMN_LENGTH. In caso contrario, il campo non è usato. Si noti che alcuni driver possono scrivere solo il bit inferiore a 32 bit o 16 bit di un buffer e lasciare invariato il bit di ordine superiore. Pertanto, le applicazioni devono inizializzare il valore su 0 prima di chiamare questa funzione.
Valori restituiti
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR o SQL_INVALID_HANDLE.
Diagnostica
Quando SQLColAttribute restituisce SQL_ERROR o SQL_SUCCESS_WITH_INFO, è possibile ottenere un valore SQLSTATE associato chiamando SQLGetDiagRec con handleTypedi SQL_HANDLE_STMT e handle di StatementHandle. La tabella seguente elenca i valori SQLSTATE comunemente restituiti da SQLColAttribute e ne spiega ognuno nel contesto di questa funzione. La notazione "(DM)" precede le descrizioni di SQLSTATEs restituite da Gestione driver. Il codice restituito associato a ogni valore SQLSTATE è SQL_ERROR, a meno che non sia specificato diversamente.
SQLSTATE | Errore | Descrizione |
---|---|---|
01000 | Avviso generale | Messaggio informativo specifico del driver. (La funzione restituisce SQL_SUCCESS_WITH_INFO. |
01004 | Dati stringa, troncati a destra | Il buffer *CharacterAttributePtr non è sufficientemente grande da restituire l'intero valore stringa, quindi il valore stringa è stato troncato. La lunghezza del valore stringa non troncata viene restituita in *StringLengthPtr. (La funzione restituisce SQL_SUCCESS_WITH_INFO. |
07005 | Istruzione preparata non specifica cursore | L'istruzione associata a StatementHandle non ha restituito un set di risultati e FieldIdentifier non è stato SQL_DESC_COUNT. Nessuna colonna da descrivere. |
07009 | Indice descrittore non valido | (DM) Il valore specificato per ColumnNumber è uguale a 0 e l'attributo dell'istruzione SQL_ATTR_USE_BOOKMARKS è stato SQL_UB_OFF. Il valore specificato per l'argomento ColumnNumber è maggiore del numero di colonne nel set di risultati. |
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 SQLGetDiagField dalla struttura dei dati di diagnostica 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. |
HY008 | Operazione annullata | L'elaborazione asincrona è stata abilitata per StatementHandle. La funzione è stata chiamata e prima di completare l'esecuzione, SQLCancel o SQLCancelHandle è stata chiamata in StatementHandle. La funzione è stata quindi chiamata di nuovo in StatementHandle. La funzione è stata chiamata e prima del completamento dell'esecuzione, SQLCancel o SQLCancelHandle è stato chiamato su StatementHandle da un thread diverso in un'applicazione multithread. |
HY010 | Errore della sequenza di funzioni | (DM) È stata chiamata una funzione in esecuzione asincrona per l'handle di connessione associato a StatementHandle. Questa funzione asincrona era ancora in esecuzione quando è stato chiamato SQLColAttribute. (DM) SQLExecute, SQLExecDirect o SQLMoreResults è stato chiamato per StatementHandle e restituito SQL_PARAM_DATA_AVAILABLE. Questa funzione è stata chiamata prima del recupero dei dati per tutti i parametri trasmessi. (DM) La funzione è stata chiamata prima di chiamare SQLPrepare, SQLExecDirect o una funzione di catalogo per StatementHandle. (DM) Una funzione in esecuzione asincrona (non questa) è stata chiamata per StatementHandle ed è ancora in esecuzione quando questa funzione è stata chiamata. (DM) SQLExecute, SQLExecDirect, SQLBulkOperations o SQLSetPos è stato chiamato per StatementHandle e restituito SQL_NEED_DATA. Questa funzione è stata chiamata prima dell'invio dei dati per tutti i parametri o le colonne data-at-execution. |
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. |
HY090 | Lunghezza della stringa o del buffer non valida | (DM) *CharacterAttributePtr è una stringa di caratteri e BufferLength è minore di 0, ma non uguale a SQL_NTS. |
HY091 | Identificatore di campo del descrittore non valido | Il valore specificato per l'argomento FieldIdentifier non è uno dei valori definiti e non è un valore definito dall'implementazione. |
HY117 | La connessione viene sospesa a causa dello stato sconosciuto della transazione. Sono consentite solo funzioni disconnesse e di sola lettura. | (DM) Per altre informazioni sullo stato sospeso, vedere Funzione SQLEndTran. |
HYC00 | Driver non in grado di supportare | Il valore specificato per l'argomento FieldIdentifier non è supportato dal driver. |
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 a StatementHandle non supporta la funzione. |
IM017 | Il polling è disabilitato in modalità di notifica asincrona | Ogni volta che viene usato il modello di notifica, il polling è disabilitato. |
IM018 | SQLCompleteAsync non è stato chiamato per completare l'operazione asincrona precedente su questo handle. | Se la chiamata di funzione precedente sull'handle restituisce SQL_STILL_EXECUTING e se la modalità di notifica è abilitata, è necessario chiamare SQLCompleteAsync sull'handle per eseguire la post-elaborazione e completare l'operazione. |
Quando viene chiamato dopo SQLPrepare e prima di SQLExecute, SQLColAttribute può restituire qualsiasi SQLSTATE che può essere restituito da SQLPrepare o SQLExecute, a seconda di quando l'origine dati valuta l'istruzione SQL associata a StatementHandle.
Per motivi di prestazioni, un'applicazione non deve chiamare SQLColAttribute prima di eseguire un'istruzione.
Commenti
Per informazioni su come le applicazioni usano le informazioni restituite da SQLColAttribute, vedere Metadati del set di risultati.
SQLColAttribute restituisce informazioni in *NumericAttributePtr o in *CharacterAttributePtr. Le informazioni sui numeri interi vengono restituite in *NumericAttributePtr come valore SQLLEN. Tutti gli altri formati di informazioni vengono restituiti in *CharacterAttributePtr. Quando vengono restituite informazioni in *NumericAttributePtr, il driver ignora CharacterAttributePtr, BufferLength e StringLengthPtr. Quando vengono restituite informazioni in *CharacterAttributePtr, il driver ignora NumericAttributePtr.
SQLColAttribute restituisce valori dai campi descrittore dell'IRD. La funzione viene chiamata con un handle di istruzione anziché con un handle descrittore. I valori restituiti da SQLColAttribute per i valori FieldIdentifier elencati più avanti in questa sezione possono anche essere recuperati chiamando SQLGetDescField con l'handle IRD appropriato.
I campi descrittori attualmente definiti, la versione di ODBC in cui sono stati introdotti e gli argomenti in cui vengono restituite le informazioni vengono visualizzati più avanti in questa sezione; più tipi di descrittore possono essere definiti dai driver per sfruttare i vantaggi di origini dati diverse.
ODBC 3.x driver deve restituire un valore per ogni campo descrittore. Se un campo descrittore non si applica a un driver o a un'origine dati e, se non diversamente specificato, il driver restituisce 0 in *StringLengthPtr o una stringa vuota in *CharacterAttributePtr.
Compatibilità con le versioni precedenti
ODBC 3.La funzione x SQLColAttribute sostituisce odbc 2 deprecato.Funzione x SQLColAttributes. Quando si esegue il mapping di SQLColAttributes a SQLColAttribute (quando odbc 2.L'applicazione x funziona con odbc 3.x driver) o mapping di SQLColAttribute a SQLColAttributes (quando odbc 3.L'applicazione x funziona con odbc 2.x driver), Gestione driver passa il valore di FieldIdentifier attraverso, lo esegue il mapping a un nuovo valore o restituisce un errore, come indicato di seguito:
Nota
Prefisso usato nei valori FieldIdentifier in ODBC 3.x è stato modificato rispetto a quello usato in ODBC 2.x. Il nuovo prefisso è "SQL_DESC"; il prefisso precedente era "SQL_COLUMN".
Se il valore #define di ODBC 2.xFieldIdentifier corrisponde al valore #define di ODBC 3.xFieldIdentifier, il valore nella chiamata di funzione viene appena passato.
Valori #define di ODBC 2.XFieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION e SQL_COLUMN_SCALE sono diversi dai valori #define di ODBC 3.xFieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE e SQL_DESC_LENGTH. ODBC 2.X Driver deve supportare solo ODBC 2.x valori. ODBC 3.X Driver deve supportare sia i valori "SQL_COLUMN" che "SQL_DESC" per questi tre FieldIdentifiers. Questi valori sono diversi perché precisione, scala e lunghezza sono definiti in modo diverso in ODBC 3.x che erano in ODBC 2.x. Per altre informazioni, vedere Dimensioni delle colonne, Cifre decimali, Lunghezza ottetto di trasferimento e Dimensioni di visualizzazione.
Se il valore #define di ODBC 2.xFieldIdentifier è diverso dal valore #define di ODBC 3.xFieldIdentifier, come avviene con i valori COUNT, NAME e NULLABLE, il valore nella chiamata di funzione viene mappato al valore corrispondente. Ad esempio, SQL_COLUMN_COUNT viene mappato a SQL_DESC_COUNT e SQL_DESC_COUNT viene mappato a SQL_COLUMN_COUNT, a seconda della direzione del mapping.
Se FieldIdentifier è un nuovo valore in ODBC 3.x, per cui non esiste alcun valore corrispondente in ODBC 2.x, non verrà mappato quando un ODBC 3.L'applicazione x la usa in una chiamata a SQLColAttribute in un'applicazione ODBC 2.x driver e la chiamata restituirà SQLSTATE HY091 (identificatore di campo del descrittore non valido).
Nella tabella seguente sono elencati i tipi di descrittore restituiti da SQLColAttribute. Il tipo per i valori NumericAttributePtr è SQLLEN *.
FieldIdentifier | Informazioni restituito in |
Descrizione |
---|---|---|
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se la colonna è una colonna di rilevamento automatico. SQL_FALSE se la colonna non è una colonna di rilevamento automatico o non è numerica. Questo campo è valido solo per le colonne di tipo di dati numerico. Un'applicazione può inserire valori in una riga contenente una colonna autoincrement, ma in genere non può aggiornare i valori nella colonna. Quando un inserimento viene eseguito in una colonna di inserimento automatico, viene inserito un valore univoco nella colonna in fase di inserimento. L'incremento non è definito, ma è specifico dell'origine dati. Un'applicazione non deve presupporre che una colonna di registrazione automatica inizi in un determinato punto o incrementi di qualsiasi valore specifico. |
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) | CharacterAttributePtr | Nome della colonna di base per la colonna del set di risultati. Se non esiste un nome di colonna di base ,come nel caso di colonne che sono espressioni, questa variabile contiene una stringa vuota. Queste informazioni vengono restituite dal campo record SQL_DESC_BASE_COLUMN_NAME del valore IRD, ovvero un campo di sola lettura. |
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) | CharacterAttributePtr | Nome della tabella di base che contiene la colonna. Se il nome della tabella di base non può essere definito o non è applicabile, questa variabile contiene una stringa vuota. Queste informazioni vengono restituite dal campo di record SQL_DESC_BASE_TABLE_NAME dell'IRD, ovvero un campo di sola lettura. |
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se la colonna viene considerata con distinzione tra maiuscole e minuscole per le regole di confronto e i confronti. SQL_FALSE se la colonna non viene considerata come distinzione tra maiuscole e minuscole per le regole di confronto e i confronti o non è un carattere di confronto. |
SQL_DESC_CATALOG_NAME (ODBC 2.0) | CharacterAttributePtr | Catalogo della tabella contenente la colonna. Il valore restituito è definito dall'implementazione se la colonna è un'espressione o se la colonna fa parte di una vista. Se l'origine dati non supporta cataloghi o non è possibile determinare il nome del catalogo, viene restituita una stringa vuota. Questo campo di record VARCHAR non è limitato a 128 caratteri. |
SQL_DESC_CONCISE_TYPE (ODBC 1.0) | NumericAttributePtr | Tipo di dati conciso. Per i tipi di dati datetime e interval, questo campo restituisce il tipo di dati conciso; ad esempio SQL_TYPE_TIME o SQL_INTERVAL_YEAR. Per altre informazioni, vedere Identificatori e descrittori del tipo di dati nell'Appendice D: Tipi di dati. Queste informazioni vengono restituite dal campo record SQL_DESC_CONCISE_TYPE dell'IRD. |
SQL_DESC_COUNT (ODBC 1.0) | NumericAttributePtr | Numero di colonne disponibili nel set di risultati. Restituisce 0 se non sono presenti colonne nel set di risultati. Il valore nell'argomento ColumnNumber viene ignorato. Queste informazioni vengono restituite dal campo di intestazione SQL_DESC_COUNT dell'IRD. |
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) | NumericAttributePtr | Numero massimo di caratteri necessari per visualizzare i dati dalla colonna. Per altre informazioni sulle dimensioni di visualizzazione, vedere Dimensioni delle colonne, Cifre decimali, Lunghezza ottetto di trasferimento e Dimensioni di visualizzazione nell'Appendice D: Tipi di dati. |
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se la colonna ha una precisione fissa e una scala diversa da zero specifica dell'origine dati. SQL_FALSE se la colonna non dispone di una scala con precisione fissa e diversa da zero specifica dell'origine dati. |
SQL_DESC_LABEL (ODBC 2.0) | CharacterAttributePtr | Etichetta o titolo della colonna. Ad esempio, una colonna denominata EmpName potrebbe essere etichettata nome dipendente o potrebbe essere etichettata con un alias. Se una colonna non dispone di un'etichetta, viene restituito il nome della colonna. Se la colonna non è etichettata e senza nome, viene restituita una stringa vuota. |
SQL_DESC_LENGTH (ODBC 3.0) | NumericAttributePtr | Valore numerico che corrisponde alla lunghezza massima o effettiva del carattere di una stringa di caratteri o di un tipo di dati binario. È la lunghezza massima del carattere per un tipo di dati a lunghezza fissa o la lunghezza effettiva del carattere per un tipo di dati a lunghezza variabile. Il valore esclude sempre il byte di terminazione Null che termina la stringa di caratteri. Queste informazioni vengono restituite dal campo record SQL_DESC_LENGTH dell'IRD. Per altre informazioni sulla lunghezza, vedere Dimensioni delle colonne, Cifre decimali, Lunghezza ottetto di trasferimento e Dimensioni di visualizzazione nell'Appendice D: Tipi di dati. |
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) | CharacterAttributePtr | Questo campo di record VARCHAR(128) contiene il carattere o i caratteri riconosciuti dal driver come prefisso per un valore letterale di questo tipo di dati. Questo campo contiene una stringa vuota per un tipo di dati per il quale non è applicabile un prefisso letterale. Per altre informazioni, vedere Prefissi letterali e suffissi. |
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) | CharacterAttributePtr | Questo campo di record VARCHAR(128) contiene il carattere o i caratteri riconosciuti dal driver come suffisso per un valore letterale di questo tipo di dati. Questo campo contiene una stringa vuota per un tipo di dati per il quale non è applicabile un suffisso letterale. Per altre informazioni, vedere Prefissi letterali e suffissi. |
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) | CharacterAttributePtr | Questo campo di record VARCHAR(128) contiene qualsiasi nome localizzato (lingua nativa) per il tipo di dati che può essere diverso dal nome normale del tipo di dati. Se non è presente alcun nome localizzato, viene restituita una stringa vuota. Questo campo è solo a scopo di visualizzazione. Il set di caratteri della stringa dipende dalle impostazioni locali ed è in genere il set di caratteri predefinito del server. |
SQL_DESC_NAME (ODBC 3.0) | CharacterAttributePtr | Alias di colonna, se applicabile. Se l'alias di colonna non si applica, viene restituito il nome della colonna. In entrambi i casi, SQL_DESC_UNNAMED è impostato su SQL_NAMED. Se non è presente alcun nome di colonna o un alias di colonna, viene restituita una stringa vuota e SQL_DESC_UNNAMED è impostata su SQL_UNNAMED. Queste informazioni vengono restituite dal campo record SQL_DESC_NAME dell'IRD. |
SQL_DESC_NULLABLE (ODBC 3.0) | NumericAttributePtr | 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 è noto se la colonna accetta valori NULL. Queste informazioni vengono restituite dal campo record SQL_DESC_NULLABLE dell'IRD. |
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) | NumericAttributePtr | Se il tipo di dati nel campo SQL_DESC_TYPE è un tipo di dati numerico approssimativo, questo campo SQLINTEGER contiene un valore pari a 2 perché il campo SQL_DESC_PRECISION contiene il numero di bit. Se il tipo di dati nel campo SQL_DESC_TYPE è un tipo di dati numerico esatto, questo campo contiene un valore pari a 10 perché il campo SQL_DESC_PRECISION contiene il numero di cifre decimali. Questo campo è impostato su 0 per tutti i tipi di dati non numerici. |
SQL_DESC_OCTET_LENGTH (ODBC 3.0) | NumericAttributePtr | Lunghezza, in byte, di una stringa di caratteri o di un tipo di dati binario. Per i tipi di caratteri a lunghezza fissa o binari, si tratta della lunghezza effettiva in byte. Per i tipi di caratteri a lunghezza variabile o binari, si tratta della lunghezza massima in byte. Questo valore non include il carattere di terminazione Null. Queste informazioni vengono restituite dal campo record SQL_DESC_OCTET_LENGTH dell'IRD. Per altre informazioni sulla lunghezza, vedere Dimensioni delle colonne, Cifre decimali, Lunghezza ottetto di trasferimento e Dimensioni di visualizzazione nell'Appendice D: Tipi di dati. |
SQL_DESC_PRECISION (ODBC 3.0) | NumericAttributePtr | Valore numerico che per un tipo di dati numerico indica la precisione applicabile. Per i tipi di dati SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP e tutti i tipi di dati intervallo che rappresentano un intervallo di tempo, il relativo valore è la precisione applicabile del componente secondi frazionari. Queste informazioni vengono restituite dal campo record SQL_DESC_PRECISION dell'IRD. |
SQL_DESC_SCALE (ODBC 3.0) | NumericAttributePtr | Valore numerico che rappresenta la scala applicabile per un tipo di dati numerico. Per i tipi di dati DECIMAL e NUMERIC, si tratta della scala definita. Non è definito per tutti gli altri tipi di dati. Queste informazioni vengono restituite dal campo record SCALE dell'IRD. |
SQL_DESC_SCHEMA_NAME (ODBC 2.0) | CharacterAttributePtr | Schema della tabella contenente la colonna. Il valore restituito è definito dall'implementazione se la colonna è un'espressione o se la colonna fa parte di una vista. Se l'origine dati non supporta schemi o non è possibile determinare il nome dello schema, viene restituita una stringa vuota. Questo campo di record VARCHAR non è limitato a 128 caratteri. |
SQL_DESC_SEARCHABLE (ODBC 1.0) | NumericAttributePtr | SQL_PRED_NONE se la colonna non può essere utilizzata in una clausola WHERE. Corrisponde al valore 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. Corrisponde al valore 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 ad eccezione di LIKE. Si tratta dello 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. Le colonne di tipo SQL_LONGVARCHAR e SQL_LONGVARBINARY in genere restituiscono SQL_PRED_CHAR. |
SQL_DESC_TABLE_NAME (ODBC 2.0) | CharacterAttributePtr | Nome della tabella che contiene la colonna. Il valore restituito è definito dall'implementazione se la colonna è un'espressione o se la colonna fa parte di una vista. Se non è possibile determinare il nome della tabella, viene restituita una stringa vuota. |
SQL_DESC_TYPE (ODBC 3.0) | NumericAttributePtr | Valore numerico che specifica il tipo di dati SQL. Quando ColumnNumber è uguale a 0, viene restituito SQL_BINARY per i segnalibri a lunghezza variabile e SQL_INTEGER viene restituito per i segnalibri a lunghezza fissa. Per i tipi di dati datetime e interval, questo campo restituisce il tipo di dati dettagliato: SQL_DATETIME o SQL_INTERVAL. Per altre informazioni, vedere Identificatori e descrittori del tipo di dati nell'Appendice D: Tipi di dati. Queste informazioni vengono restituite dal campo record SQL_DESC_TYPE dell'IRD. Nota: per lavorare con ODBC 2.x driver, usare invece SQL_DESC_CONCISE_TYPE. |
SQL_DESC_TYPE_NAME (ODBC 1.0) | CharacterAttributePtr | Nome del tipo di dati dipendente dall'origine dati; ad esempio "CHAR", "VARCHAR", "MONEY", "LONG VARBINARY" o "CHAR ( ) FOR BIT DATA". Se il tipo è sconosciuto, viene restituita una stringa vuota. |
SQL_DESC_UNNAMED (ODBC 3.0) | NumericAttributePtr | SQL_NAMED o SQL_UNNAMED. Se il campo SQL_DESC_NAME di IRD contiene un alias di colonna o un nome di colonna, viene restituito SQL_NAMED. Se non è presente alcun nome di colonna o alias di colonna, viene restituito SQL_UNNAMED. Queste informazioni vengono restituite dal campo record SQL_DESC_UNNAMED dell'IRD. |
SQL_DESC_UNSIGNED (ODBC 1.0) | NumericAttributePtr | SQL_TRUE se la colonna è senza segno (o non numerico). SQL_FALSE se la colonna è firmata. |
SQL_DESC_UPDATABLE (ODBC 1.0) | NumericAttributePtr | La colonna è descritta dai valori per le costanti definite: SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN SQL_DESC_UPDATABLE descrive l'updatabilità della colonna nel set di risultati, non la colonna nella tabella di base. L'updatabilità della colonna di base su cui si basa la colonna del set di risultati può essere diversa dal valore in questo campo. Indica se una colonna è aggiornabile può essere basata sul tipo di dati, sui privilegi utente e sulla definizione del set di risultati stesso. Se non è chiaro se una colonna è aggiornabile, SQL_ATTR_READWRITE_UNKNOWN deve essere restituita. |
SQLColAttribute è un'alternativa estendibile a SQLDescribeCol. SQLDescribeCol restituisce un set fisso di informazioni sul descrittore basato su SQL ANSI-89. SQLColAttribute consente l'accesso al set più esteso di informazioni sui descrittori disponibili nelle estensioni del fornitore ANSI SQL-92 e DBMS.
Funzioni correlate
Per informazioni su | Vedere |
---|---|
Associazione di un buffer a una colonna in un set di risultati | Funzione SQLBindCol |
Annullamento dell'elaborazione delle istruzioni | Funzione SQLCancel |
Restituzione di informazioni su una colonna in un set di risultati | Funzione SQLDescribeCol |
Recupero di un blocco di dati o scorrimento di un set di risultati | Funzione SQLFetchScroll |
Recupero di più righe di dati | Funzione SQLFetch |
Esempio
Il codice di esempio seguente non libera handle e connessioni. Vedere Funzione SQLFreeHandle, Programma ODBC di esempio e Funzione SQLFreeStmt per esempi di codice per gestire e istruzioni gratuite.
// SQLColAttibute.cpp
// compile with: user32.lib odbc32.lib
#define UNICODE
#include <windows.h>
#include <sqlext.h>
#include <strsafe.h>
struct DataBinding {
SQLSMALLINT TargetType;
SQLPOINTER TargetValuePtr;
SQLINTEGER BufferLength;
SQLLEN StrLen_or_Ind;
};
void printStatementResult(SQLHSTMT hstmt) {
int bufferSize = 1024, i;
SQLRETURN retCode;
SQLSMALLINT numColumn = 0, bufferLenUsed;
retCode = SQLNumResultCols(hstmt, &numColumn);
SQLPOINTER* columnLabels = (SQLPOINTER *)malloc( numColumn * sizeof(SQLPOINTER*) );
struct DataBinding* columnData = (struct DataBinding*)malloc( numColumn * sizeof(struct DataBinding) );
printf( "Columns from that table:\n" );
for ( i = 0 ; i < numColumn ; i++ ) {
columnLabels[i] = (SQLPOINTER)malloc( bufferSize*sizeof(char) );
retCode = SQLColAttribute(hstmt, (SQLUSMALLINT)i + 1, SQL_DESC_LABEL, columnLabels[i], (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);
wprintf( L"Column %d: %s\n", i, (wchar_t*)columnLabels[i] );
}
// allocate memory for the binding
for ( i = 0 ; i < numColumn ; i++ ) {
columnData[i].TargetType = SQL_C_CHAR;
columnData[i].BufferLength = (bufferSize+1);
columnData[i].TargetValuePtr = malloc( sizeof(unsigned char)*columnData[i].BufferLength );
}
// setup the binding
for ( i = 0 ; i < numColumn ; i++ ) {
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,
columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));
}
printf( "Data from that table:\n" );
// fetch the data and print out the data
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt) ) {
int j;
for ( j = 0 ; j < numColumn ; j++ )
wprintf( L"%s: %hs\n", columnLabels[j], columnData[j].TargetValuePtr );
printf( "\n" );
}
printf( "\n" );
}
int main() {
int bufferSize = 1024, i, count = 1, numCols = 5;
wchar_t firstTableName[1024], * dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize ), * userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );
HWND desktopHandle = GetDesktopWindow(); // desktop's window handle
SQLWCHAR connStrbuffer[1024];
SQLSMALLINT connStrBufferLen, bufferLen;
SQLRETURN retCode;
SQLHENV henv = NULL; // Environment
SQLHDBC hdbc = NULL; // Connection handle
SQLHSTMT hstmt = NULL; // Statement handle
struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );
SQLWCHAR* selectAllQuery = (SQLWCHAR *)malloc( sizeof(SQLWCHAR) * bufferSize );
// connect to database
retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLCHAR *)(void*)SQL_OV_ODBC3, -1);
retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);
retCode = SQLDriverConnect(hdbc, desktopHandle, L"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);
retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
// display the database information
retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferLen);
retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, &bufferLen);
for ( i = 0 ; i < numCols ; i++ ) {
catalogResult[i].TargetType = SQL_C_CHAR;
catalogResult[i].BufferLength = (bufferSize + 1);
catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );
}
// Set up the binding. This can be used even if the statement is closed by closeStatementHandle
for ( i = 0 ; i < numCols ; i++ )
retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));
retCode = SQLTables( hstmt, (SQLWCHAR*)SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
retCode = SQLTables( hstmt, dbName, SQL_NTS, userName, SQL_NTS, L"%", SQL_NTS, L"TABLE", SQL_NTS );
for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt), ++count )
if ( count == 1 )
StringCchPrintfW( firstTableName, 1024, L"%hs", catalogResult[2].TargetValuePtr );
retCode = SQLFreeStmt(hstmt, SQL_CLOSE);
wprintf( L"Select all data from the first table (%s)\n", firstTableName );
StringCchPrintfW( selectAllQuery, bufferSize, L"SELECT * FROM %s", firstTableName );
retCode = SQLExecDirect(hstmt, selectAllQuery, SQL_NTS);
printStatementResult(hstmt);
}
Vedi anche
Riferimento API ODBC
File di intestazione ODBC
Programma di esempio ODBC