Condividi tramite


Recupero di dati dei risultati

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 utilizza SQLBindCol per associare ogni colonna nel set di risultati a una variabile di programma. Una volta associate 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 SQL_ATTR_ROW_ARRAY_SIZE è impostato su un valore maggiore di 1, l'applicazione può associare le colonne dei risultati a matrici di variabili, che verranno tutte specificate a ogni chiamata a SQLFetchScroll.

La seconda opzione è basata su SQLGetData. L'applicazione non utilizza SQLBindCol per associare le colonne del set di risultati a 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 dati da una colonna del set di risultati specifica a una determinata variabile di programma 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 di tipo text, ntext e image hanno in genere dimensioni troppo elevate per adattarsi a una variabile di programma, ma possono comunque essere recuperate tramite SQLGetData. Se i dati text, ntext o image nella colonna dei risultati hanno dimensioni maggiori della variabile di programma, SQLGetData restituisce SQL_SUCCESS_WITH_INFO e SQLSTATE 01004 (dati string, troncati a destra). Le chiamate successive a SQLGetData restituiscono blocchi successivi dei dati text o image. 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 utilizzare SQLGetData, è necessario utilizzare SQLSetPos per specificare come riga corrente una determinata riga all'interno del set di righe.

La terza opzione consiste nell'utilizzare una combinazione di SQLBindCol e SQLGetData. Un'applicazione può, ad esempio, associare le prime dieci colonne di un set di risultati e quindi, a ogni recupero, chiamare SQLGetData tre volte per recuperare i dati da tre colonne non associate. Questo metodo viene in genere utilizzato quando un set di risultati contiene una o più colonne text o image.

A seconda delle opzioni del cursore impostate per il set di risultati, un'applicazione può inoltre utilizzare le opzioni di scorrimento di SQLFetchScroll per scorrere il set di risultati.

Un utilizzo eccessivo di SQLBindCol per associare una colonna del set di risultati a una variabile di programma rappresenta un'operazione dispendiosa, in quanto SQLBindCol provoca l'allocazione di memoria da parte di un driver ODBC. Quando si associa una colonna dei risultati a una variabile, l'associazione rimane effettiva fino a quando non si chiama SQLFreeHandle per rilasciare l'handle di istruzione o 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 volta, elaborare tutte le istruzioni SELECT, quindi chiamare SQLFreeStmt con fOption impostato su SQL_UNBIND in seguito all'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 rilasciare qualsiasi associazione precedente.

Quando si utilizza SQLBindCol, è possibile eseguire un'associazione per riga o per colonna. L'associazione per riga è leggermente più veloce dell'associazione per colonna.

È possibile utilizzare SQLGetData per recuperare dati colonna per colonna anziché associare le colonne del set di risultati utilizzando SQLBindCol. Se un set di risultati contiene solo poche righe, l'utilizzo di SQLGetData anziché di SQLBindCol risulta più veloce. Al contrario, SQLBindCol offre prestazioni ottimali. Se i dati non vengono inseriti sempre nello stesso set di variabili, è consigliabile utilizzare SQLGetData anziché ripetere l'associazione continuamente. È possibile utilizzare solo SQLGetData in colonne incluse nell'elenco di selezione una volta associate tutte le colonne con SQLBindCol. La colonna deve inoltre essere visualizzata dopo tutte le altre colonne in cui è già stato utilizzato SQLGetData.

Le funzioni ODBC che gestiscono lo spostamento di dati all'interno e 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 in genere 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 sufficientemente grandi 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 si specifica SQL_C_DEFAULT per una colonna ntext, nchar o nvarchar, all'applicazione vengono restituiti dati Unicode. 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 o image hanno in genere dimensioni troppo elevate per essere inclusi in una singola variabile di programma e solitamente vengono elaborati con SQLGetData anziché con SQLBindCol. Quando si utilizzano cursori del server, il driver ODBC di SQL Server Native Client è ottimizzato per non trasmettere i dati per colonne text, ntext e** image** non associate al momento del recupero della riga. I dati text, ntext o image non vengono effettivamente recuperati dal server fino a quando l'applicazione non esegue SQLGetData per la colonna.

Questa ottimizzazione può essere applicata alle applicazioni in modo che non venga visualizzato alcun dato text, ntext o image quando un utente scorre verso l'alto e verso il basso un cursore. Dopo che l'utente seleziona una riga, l'applicazione può chiamare SQLGetData per recuperare i dati text, ntext o image. Questo comportamento evita la trasmissione dei dati text, ntext o image per tutte le righe non selezionate dall'utente e la trasmissione di quantità elevate di dati.

Vedere anche

Concetti