Recupero di dati dei risultati
Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW)
Un'applicazione ODBC dispone di tre opzioni per il recupero dei dati dei risultati.
La prima opzione è basata su SQLBindCol. Prima di recuperare il set di risultati, l'applicazione usa SQLBindCol per associare ogni colonna nel set di risultati a una variabile di programma. Dopo aver associato le colonne, il driver trasferisce i dati della riga corrente nelle variabili associate alle colonne del set di risultati ogni volta che l'applicazione chiama SQLFetch o SQLFetchScroll. Il driver gestisce le conversioni di dati se la colonna del set di risultati e la variabile di programma hanno tipi di dati diversi. Se l'applicazione ha impostato SQL_ATTR_ROW_ARRAY_SIZE maggiore di 1, può associare le colonne dei risultati a matrici di variabili, che verranno tutte compilate in ogni chiamata a SQLFetchScroll.
La seconda opzione è basata su SQLGetData. L'applicazione non usa SQLBindCol per associare le colonne del set di risultati alle variabili di programma. Dopo ogni chiamata a SQLFetch, l'applicazione chiama SQLGetData una volta per ogni colonna nel set di risultati. SQLGetData indica al driver di trasferire i dati da una colonna specifica del set di risultati a una variabile di programma specifica e specifica i tipi di dati della colonna e della variabile. In questo modo il driver può convertire dati se la colonna dei risultati e la variabile di programma hanno tipi di dati diversi. Le colonne text, ntext e image sono in genere troppo grandi per adattarsi a una variabile di programma, ma possono comunque essere recuperate usando SQLGetData. Se i dati text, ntext o image nella colonna dei risultati sono maggiori della variabile di programma, SQLGetData restituisce SQL_SUCCESS_WITH_INFO e SQLSTATE 01004 (dati stringa troncati a destra). Le chiamate successive a SQLGetData restituiscono blocchi successivi dei dati di testo o immagine . Quando viene raggiunta la fine dei dati, SQLGetData restituisce SQL_SUCCESS. Ciascun recupero restituisce un set di righe se SQL_ATTR_ROW_ARRAY_SIZE è maggiore di 1. Prima di usare SQLGetData, è necessario usare SQLSetPos per specificare una riga specifica all'interno del set di righe come riga corrente.
La terza opzione consiste nell'usare una combinazione di SQLBindCol e SQLGetData. Un'applicazione, ad esempio, potrebbe associare le prime dieci colonne di un set di risultati e quindi, in ogni recupero, chiamare SQLGetData tre volte per recuperare i dati da tre colonne non associate. Questa operazione viene in genere utilizzata quando un set di risultati contiene una o più colonne di testo o immagine .
A seconda delle opzioni del cursore impostate per il set di risultati, un'applicazione può anche usare le opzioni di scorrimento di SQLFetchScroll per scorrere il set di risultati.
L'utilizzo eccessivo di SQLBindCol per associare una colonna del set di risultati a una variabile di programma è costoso perché SQLBindCol causa l'allocazione di memoria da parte di un driver ODBC. Quando si associa una colonna dei risultati a una variabile, tale associazione rimane attiva fino a quando non si chiama SQLFreeHandle per liberare l'handle dell'istruzione o chiamare SQLFreeStmt con fOption impostato su SQL_UNBIND. Le associazioni non vengono annullate automaticamente al termine dell'istruzione.
Questa logica consente di gestire in modo efficace l'esecuzione della stessa istruzione SELECT più volte con parametri diversi. Poiché il set di risultati mantiene la stessa struttura, è possibile associare il set di risultati una sola volta, elaborare tutte le istruzioni SELECT, quindi chiamare SQLFreeStmt con fOption impostato su SQL_UNBIND dopo l'ultima esecuzione. Non è consigliabile chiamare SQLBindCol per associare le colonne in un set di risultati senza prima chiamare SQLFreeStmt con fOption impostato su SQL_UNBIND per liberare eventuali associazioni precedenti.
Quando si usa SQLBindCol, è possibile eseguire un'associazione a livello di riga o di colonna. L'associazione per riga è leggermente più veloce dell'associazione per colonna.
È possibile usare SQLGetData per recuperare i dati in base a una colonna in base alla colonna anziché l'associazione di colonne del set di risultati tramite SQLBindCol. Se un set di risultati contiene solo poche righe, l'uso di SQLGetData anziché SQLBindCol è più veloce. In caso contrario, SQLBindCol offre prestazioni ottimali. Se non si inseriscono sempre i dati nello stesso set di variabili, è consigliabile usare SQLGetData invece di riassociare costantemente. È possibile usare SQLGetData solo nelle colonne incluse nell'elenco di selezione dopo che tutte le colonne sono associate a SQLBindCol. La colonna deve essere visualizzata anche dopo tutte le colonne in cui è già stato usato SQLGetData.
Le funzioni ODBC che gestiscono lo spostamento di dati all'interno o all'esterno di variabili di programma, ad esempio SQLGetData, SQLBindCol e SQLBindParameter, supportano la conversione implicita dei tipi di dati. Se, ad esempio, un'applicazione associa una colonna integer a una variabile di programma stringa di caratteri, il driver converte automaticamente i dati da integer in carattere prima di inserirli nella variabile di programma.
La conversione dei dati nelle applicazioni deve essere ridotta al minimo. A meno che la conversione dei dati non sia necessaria per l'elaborazione eseguita dall'applicazione, è preferibile che le applicazioni non associno colonne e parametri a variabili di programma dello stesso tipo di dati. Se i dati devono essere convertiti da un tipo a un altro, tuttavia, è più efficiente fare in modo che il driver esegua la conversione anziché lasciare che la conversione venga eseguita nell'applicazione. Il driver ODBC di SQL Server Native Client trasferisce normalmente solo i dati direttamente dai buffer di rete alle variabili dell'applicazione. La richiesta al driver di convertire i dati forza il driver a eseguire il buffer dei dati e a utilizzare cicli della CPU per la conversione dei dati.
Le variabili di programma devono essere sufficienti per contenere i dati trasferiti da una colonna, ad eccezione dei dati text, ntext e image . Se un'applicazione tenta di recuperare dati del set di risultati e di inserirli in una variabile di dimensioni troppo piccole per contenerli, il driver genera un avviso. Ciò forza il driver ad allocare memoria per il messaggio e il driver e l'applicazione devono entrambi impiegare cicli della CPU per l'elaborazione del messaggio e per la gestione degli errori. L'applicazione deve allocare una variabile sufficientemente grande per contenere i dati recuperati oppure utilizzare la funzione SUBSTRING nell'elenco di selezione per ridurre le dimensioni della colonna nel set di risultati.
Quando si utilizza SQL_C_DEFAULT per specificare il tipo della variabile C, è necessario procedere con cautela. SQL_C_DEFAULT specifica che il tipo della variabile C corrisponde al tipo di dati SQL della colonna o del parametro. Se SQL_C_DEFAULT viene specificato per una colonna ntext, nchar o nvarchar , i dati Unicode vengono restituiti all'applicazione. Ciò può provocare diversi problemi se l'applicazione non è stata codificata per la gestione di dati Unicode. Gli stessi tipi di problemi possono verificarsi con il tipo di dati uniqueidentifier (SQL_GUID).
i dati text, ntext e image sono in genere troppo grandi per adattarsi a una singola variabile di programma e vengono in genere elaborati con SQLGetData anziché SQLBindCol. Quando si usano cursori server, il driver ODBC di SQL Server Native Client è ottimizzato per non trasmettere i dati per colonne di testo, ntext o immagine non associate al momento del recupero della riga. I dati di testo, ntext o immagine non vengono effettivamente recuperati dal server fino a quando l'applicazione non rilascia SQLGetData per la colonna.
Questa ottimizzazione può essere applicata alle applicazioni in modo che non vengano visualizzati dati di testo, ntext o immagine mentre un utente scorre verso l'alto e verso il basso un cursore. Dopo aver selezionato una riga, l'applicazione può chiamare SQLGetData per recuperare i dati di testo, ntext o immagine . In questo modo si salva la trasmissione dei dati di testo, ntext o immagine per qualsiasi riga che l'utente non seleziona e può salvare la trasmissione di grandi quantità di dati.