Funzione SQLFetch

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

Riepilogo
SQLFetch recupera il set di righe successivo di dati dal set di risultati e restituisce i dati per tutte le colonne associate.

Sintassi

  
SQLRETURN SQLFetch(  
     SQLHSTMT     StatementHandle);  

Argomenti

StatementHandle
[Input] Handle di istruzione.

Resi

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_STILL_EXECUTING, SQL_ERROR o SQL_INVALID_HANDLE.

Diagnostica

Quando SQLFetch restituisce SQL_ERROR o SQL_SUCCESS_WITH_INFO, è possibile ottenere un valore SQLSTATE associato chiamando la funzione SQLGetDiagRec con handleType di SQL_HANDLE_STMT e handle di StatementHandle. La tabella seguente elenca i valori SQLSTATE restituiti in genere da SQLFetch 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. Se si verifica un errore in una singola colonna, è possibile chiamare SQLGetDiagField con un DiagIdentifier di SQL_DIAG_COLUMN_NUMBER per determinare la colonna in cui si è verificato l'errore e SQLGetDiagField può essere chiamato con un DiagIdentifier di SQL_DIAG_ROW_NUMBER per determinare la riga contenente tale colonna.

Per tutti gli SQLSTATEs che possono restituire SQL_SUCCESS_WITH_INFO o SQL_ERROR (ad eccezione di 01xxx SQLSTATEs), SQL_SUCCESS_WITH_INFO viene restituito se si verifica un errore in una o più righe, ma non tutte, righe di un'operazione multirow e SQL_ERROR viene restituito se si verifica un errore in un'operazione a riga singola.

SQLSTATE Errore Descrizione
01000 Avviso generale Messaggio informativo specifico del driver. (La funzione restituisce SQL_SUCCESS_WITH_INFO.
01004 Dati stringa, troncati a destra I dati stringa o binari restituiti per una colonna hanno comportato il troncamento di dati binari non null o non NULL. Se si tratta di un valore stringa, è stato troncato a destra.
01S01 Errore nella riga Errore durante il recupero di una o più righe.

Se questo SQLSTATE viene restituito quando un'applicazione ODBC 3*.x* utilizza un driver ODBC 2*.x*, può essere ignorata.
01S07 Troncamento frazionario I dati restituiti per una colonna sono stati troncati. Per i tipi di dati numerici, la parte frazionaria del numero è stata troncata. Per i tipi di dati time, timestamp e interval che contengono un componente time, la parte frazionaria dell'ora è stata troncata.

(La funzione restituisce SQL_SUCCESS_WITH_INFO.
07006 Violazione dell'attributo del tipo di dati con restrizioni Impossibile convertire il valore di dati di una colonna nel set di risultati nel tipo di dati specificato da TargetType in SQLBindCol.

La colonna 0 è stata associata a un tipo di dati di SQL_C_BOOKMARK e l'attributo dell'istruzione SQL_ATTR_USE_BOOKMARKS è stato impostato su SQL_UB_VARIABLE.

La colonna 0 è stata associata a un tipo di dati di SQL_C_VARBOOKMARK e l'attributo dell'istruzione SQL_ATTR_USE_BOOKMARKS non è stato impostato su SQL_UB_VARIABLE.
07009 Indice descrittore non valido Il driver era un driver ODBC 2*.x* che non supporta SQLExtendedFetch e un numero di colonna specificato nell'associazione per una colonna era 0.

La colonna 0 è stata associata e l'attributo dell'istruzione SQL_ATTR_USE_BOOKMARKS è stato impostato su SQL_UB_OFF.
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 Un segnalibro a lunghezza variabile restituito per una colonna è stato troncato.
22002 Variabile indicatore obbligatoria ma non fornita I dati NULL sono stati recuperati in una colonna il cui StrLen_or_IndPtr impostato da SQLBindCol (o SQL_DESC_INDICATOR_PTR impostato da SQLSetDescField o SQLSetDescRec) era un puntatore Null.
22003 Valore numerico non compreso nell'intervallo La restituzione del valore numerico come numerico o stringa per una o più colonne associate avrebbe causato il troncamento dell'intera parte del numero , anziché frazionaria.

Per altre informazioni, vedere Conversione di dati da SQL a tipi di dati C nell'Appendice D: Tipi di dati.
22007 Formato datetime non valido Una colonna di caratteri nel set di risultati è stata associata a una struttura data, ora o timestamp C e un valore nella colonna era, rispettivamente, una data, un'ora o un timestamp non valido.
22012 Divisione per zero È stato restituito un valore di un'espressione aritmetica, che ha determinato la divisione per zero.
22015 Overflow del campo intervallo L'assegnazione da un tipo SQL numerico o intervallo esatto a un tipo C intervallo ha causato una perdita di cifre significative nel campo iniziale.

Quando si recuperano dati a un tipo C di intervallo, non è presente alcuna rappresentazione del valore del tipo SQL nel tipo C intervallo.
22018 Valore carattere non valido per la specifica del cast Una colonna di caratteri nel set di risultati è stata associata a un buffer C di caratteri e la colonna contiene un carattere per il quale non è presente alcuna rappresentazione nel set di caratteri del buffer.

Il tipo C era un tipo numerico esatto o approssimativo, datetime o un tipo di dati interval; il tipo SQL della colonna era un tipo di dati carattere; e il valore nella colonna non era un valore letterale valido del tipo C associato.
24000 Stato del cursore non valido StatementHandle era in uno stato eseguito, ma nessun set di risultati era associato a StatementHandle.
40001 Errore di serializzazione La transazione in cui è stato eseguito il recupero è stata terminata per impedire il deadlock.
40003 Completamento istruzione sconosciuto La connessione associata non è riuscita durante l'esecuzione di questa funzione e non è possibile determinare lo stato della transazione.
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.
HY008 Operazione annullata L'elaborazione asincrona è stata abilitata per StatementHandle. La funzione SQLFetch è stata chiamata e prima di completare l'esecuzione, SQLCancel o SQLCancelHandle è stata chiamata su StatementHandle. La funzione SQLFetch è stata quindi chiamata nuovamente in StatementHandle.

In alternativa, è stata chiamata la funzione SQLFetch 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 è stata chiamata la funzione SQLFetch .

(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) StatementHandle specificato non era in uno stato eseguito. La funzione è stata chiamata senza prima chiamare SQLExecDirect, SQLExecute o una funzione del catalogo.

(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.

(DM) SQLFetch è stato chiamato per StatementHandledopo la chiamata a SQLExtendedFetch e prima della chiamata di SQLFreeStmt con l'opzione SQL_CLOSE.
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 L'attributo dell'istruzione SQL_ATTR_USE_BOOKMARK è stato impostato su SQL_UB_VARIABLE e la colonna 0 è stata associata a un buffer la cui lunghezza non è uguale alla lunghezza massima per il segnalibro per questo set di risultati. Questa lunghezza è disponibile nel campo SQL_DESC_OCTET_LENGTH di IRD e può essere ottenuta chiamando SQLDescribeCol, SQLColAttribute o SQLGetDescField.
HY107 Valore di riga non compreso nell'intervallo Il valore specificato con l'attributo di istruzione SQL_ATTR_CURSOR_TYPE è stato SQL_CURSOR_KEYSET_DRIVEN, ma il valore specificato con l'attributo di istruzione SQL_ATTR_KEYSET_SIZE è maggiore di 0 e minore del valore specificato con l'attributo di istruzione SQL_ATTR_ROW_ARRAY_SIZE.
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 Funzionalità facoltativa non implementata Il driver o l'origine dati non supporta la conversione specificata dalla combinazione di TargetType in SQLBindCol e il tipo di dati SQL della colonna corrispondente.
HYT00 Timeout scaduto Periodo di timeout della query scaduto prima che l'origine dati restituisca il set di risultati richiesto. Il periodo di timeout viene impostato tramite SQLSetStmtAttr, SQL_ATTR_QUERY_TIMEOUT.
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.

Commenti

SQLFetch restituisce il set di righe successivo nel set di risultati. Può essere chiamato solo quando esiste un set di risultati, ovvero dopo una chiamata che crea un set di risultati e prima che il cursore su tale set di risultati venga chiuso. Se sono associate colonne, restituisce i dati in tali colonne. Se l'applicazione ha specificato un puntatore a una matrice di stato di riga o a un buffer in cui restituire il numero di righe recuperate, SQLFetch restituisce anche queste informazioni. Le chiamate a SQLFetch possono essere combinate con chiamate a SQLFetchScroll , ma non possono essere combinate con le chiamate a SQLExtendedFetch. Per altre informazioni, vedere Recupero di una riga di dati.

Se un'applicazione ODBC 3*.x* funziona con un driver ODBC 2*.x*, Gestione driver esegue il mapping delle chiamate SQLFetch a SQLExtendedFetch per un driver ODBC 2*.x* che supporta SQLExtendedFetch. Se il driver ODBC 2*.x* non supporta SQLExtendedFetch, Gestione driver esegue il mapping delle chiamate SQLFetch a SQLFetch nel driver ODBC 2*.x*, che può recuperare solo una singola riga.

Per altre informazioni, vedere Cursori a blocchi, cursori scorrevoli e compatibilità con le versioni precedenti nell'Appendice G: Linee guida per la compatibilità con le versioni precedenti.

Posizionamento del cursore

Quando viene creato il set di risultati, il cursore viene posizionato prima dell'inizio del set di risultati. SQLFetch recupera il set di righe successivo. Equivale a chiamare SQLFetchScroll con FetchOrientation impostato su SQL_FETCH_NEXT. Per altre informazioni sui cursori, vedere Cursori e cursori a blocchi.

L'attributo dell'istruzione SQL_ATTR_ROW_ARRAY_SIZE specifica il numero di righe nel set di righe. Se il set di righe recuperato da SQLFetch si sovrappone alla fine del set di risultati, SQLFetch restituisce un set di righe parziale. Ovvero, se S + R - 1 è maggiore di L, dove S è la riga iniziale del set di righe recuperato, R è la dimensione del set di righe e L è l'ultima riga nel set di risultati, quindi solo la prima L - S + 1 righe del set di righe sono valide. Le righe rimanenti sono vuote e hanno uno stato di SQL_ROW_NOROW.

Dopo la restituzione di SQLFetch , la riga corrente è la prima riga del set di righe.

Le regole elencate nella tabella seguente descrivono il posizionamento del cursore dopo una chiamata a SQLFetch, in base alle condizioni elencate nella seconda tabella di questa sezione.

Condizione Prima riga del nuovo set di righe
Prima di iniziare 1
CurrRowsetStart<= LastResultRow - RowsetSize[1] CurrRowsetStart + RowsetSize[2]
CurrRowsetStart>LastResultRow - RowsetSize[1] Dopo la fine
Dopo la fine Dopo la fine

[1] Se le dimensioni del set di righe vengono modificate tra i recuperi, si tratta della dimensione del set di righe usata con il recupero precedente.

[2] Se le dimensioni del set di righe vengono modificate tra i recuperi, si tratta della dimensione del set di righe usata con il nuovo recupero.

Notazione Significato
Prima di iniziare Il cursore del blocco viene posizionato prima dell'inizio del set di risultati. Se la prima riga del nuovo set di righe è prima dell'inizio del set di risultati, SQLFetch restituisce SQL_NO_DATA.
Dopo la fine Il cursore del blocco viene posizionato dopo la fine del set di risultati. Se la prima riga del nuovo set di righe è successiva alla fine del set di risultati, SQLFetch restituisce SQL_NO_DATA.
CurrRowsetStart Numero della prima riga nel set di righe corrente.
LastResultRow Numero dell'ultima riga nel set di risultati.
RowsetSize Dimensioni del set di righe.

Si supponga, ad esempio, che un set di risultati abbia 100 righe e che le dimensioni del set di righe siano 5. La tabella seguente illustra il set di righe e il codice restituito da SQLFetch per posizioni iniziali diverse.

Set di righe corrente Codice restituito Nuovo set di righe Numero di righe recuperate
Prima di iniziare SQL_SUCCESS Da 1 a 5 5
Da 1 a 5 SQL_SUCCESS Da 6 a 10 5
Da 52 a 56 SQL_SUCCESS Da 57 a 61 5
Da 91 a 95 SQL_SUCCESS Da 96 a 100 5
Da 93 a 97 SQL_SUCCESS da 98 a 100. Le righe 4 e 5 della matrice di stato della riga sono impostate su SQL_ROW_NOROW. 3
Da 96 a 100 SQL_NO_DATA Nessuno. 0
Da 99 a 100 SQL_NO_DATA Nessuno. 0
Dopo la fine SQL_NO_DATA Nessuno. 0

Restituzione di dati nelle colonne associate

Quando SQLFetch restituisce ogni riga, inserisce i dati per ogni colonna associata nel buffer associato a tale colonna. Se non sono associate colonne, SQLFetch non restituisce dati, ma sposta il cursore del blocco in avanti. I dati possono comunque essere recuperati usando SQLGetData. Se il cursore è un cursore multirow, ovvero il SQL_ATTR_ROW_ARRAY_SIZE è maggiore di 1, SQLGetData può essere chiamato solo se viene restituito SQL_GD_BLOCK quando VIENE chiamato SQLGetInfo con un InfoType di SQL_GETDATA_EXTENSIONS. Per altre informazioni, vedere SQLGetData.

Per ogni colonna associata in una riga, SQLFetch esegue le operazioni seguenti:

  1. Imposta il buffer di lunghezza/indicatore su SQL_NULL_DATA e passa alla colonna successiva se i dati sono NULL. Se i dati sono NULL e non è stato associato alcun buffer di lunghezza/indicatore, SQLFetch restituisce SQLSTATE 22002 (variabile indicatore obbligatoria ma non specificata) per la riga e procede alla riga successiva. Per informazioni su come determinare l'indirizzo del buffer di lunghezza/indicatore, vedere "Indirizzi buffer" in SQLBindCol.

    Se i dati per la colonna non sono NULL, SQLFetch procede con il passaggio 2.

  2. Se l'attributo dell'istruzione SQL_ATTR_MAX_LENGTH è impostato su un valore diverso da zero e la colonna contiene dati di tipo carattere o binari, i dati vengono troncati a SQL_ATTR_MAX_LENGTH byte.

    Nota

    L'attributo di istruzione SQL_ATTR_MAX_LENGTH è progettato per ridurre il traffico di rete. Viene in genere implementato dall'origine dati, che tronca i dati prima di restituirli in rete. I driver e le origini dati non sono necessari per supportarli. Pertanto, per garantire che i dati vengano troncati a una determinata dimensione, un'applicazione deve allocare un buffer di tale dimensione e specificare le dimensioni nell'argomento cbValueMax in SQLBindCol.

  3. Converte i dati nel tipo specificato da TargetType in SQLBindCol.

  4. Se i dati sono stati convertiti in un tipo di dati a lunghezza variabile, ad esempio carattere o binario, SQLFetch verifica se la lunghezza dei dati supera la lunghezza del buffer di dati. Se la lunghezza dei dati di tipo carattere (incluso il carattere di terminazione Null) supera la lunghezza del buffer di dati, SQLFetch tronca i dati alla lunghezza del buffer di dati meno la lunghezza di un carattere di terminazione Null. Termina quindi i dati. Se la lunghezza dei dati binari supera la lunghezza del buffer di dati, SQLFetch lo tronca alla lunghezza del buffer di dati. La lunghezza del buffer di dati viene specificata con BufferLength in SQLBindCol.

    SQLFetch non tronca mai i dati convertiti in tipi di dati a lunghezza fissa. Si presuppone sempre che la lunghezza del buffer di dati sia la dimensione del tipo di dati.

  5. Inserisce i dati convertiti (ed eventualmente troncati) nel buffer di dati. Per informazioni su come determinare l'indirizzo del buffer di dati, vedere "Indirizzi buffer" in SQLBindCol.

  6. Inserisce la lunghezza dei dati nel buffer di lunghezza/indicatore. Se il puntatore dell'indicatore e il puntatore di lunghezza sono entrambi impostati sullo stesso buffer (come una chiamata a SQLBindCol ), la lunghezza viene scritta nel buffer per i dati validi e SQL_NULL_DATA viene scritta nel buffer per i dati NULL. Se non è stato associato alcun buffer di lunghezza/indicatore, SQLFetch non restituisce la lunghezza.

    • Per i dati di tipo carattere o binario, si tratta della lunghezza dei dati dopo la conversione e prima del troncamento a causa del buffer di dati troppo piccolo. Se il driver non riesce a determinare la lunghezza dei dati dopo la conversione, come accade talvolta con dati lunghi, imposta la lunghezza su SQL_NO_TOTAL. Se i dati sono stati troncati a causa dell'attributo dell'istruzione SQL_ATTR_MAX_LENGTH, il valore di questo attributo viene inserito nel buffer di lunghezza/indicatore anziché nella lunghezza effettiva . Questo è dovuto al fatto che questo attributo è progettato per troncare i dati nel server prima della conversione, in modo che il driver non abbia modo di capire qual è la lunghezza effettiva.

    • Per tutti gli altri tipi di dati, si tratta della lunghezza dei dati dopo la conversione; ovvero è la dimensione del tipo in cui sono stati convertiti i dati.

    Per informazioni su come determinare l'indirizzo del buffer di lunghezza/indicatore, vedere "Indirizzi buffer" in SQLBindCol.

  7. Se i dati vengono troncati durante la conversione senza perdita di cifre significative (ad esempio, il numero reale 1,234 viene troncato all'intero 1 quando viene convertito), SQLFetch restituisce SQLSTATE 01S07 (troncamento frazionario) e SQL_SUCCESS_WITH_INFO. Se i dati vengono troncati perché la lunghezza del buffer di dati è troppo piccola (ad esempio, la stringa "abcdef" viene inserita in un buffer a 4 byte), SQLFetch restituisce SQLSTATE 01004 (dati troncati) e SQL_SUCCESS_WITH_INFO. Se i dati vengono troncati a causa dell'attributo dell'istruzione SQL_ATTR_MAX_LENGTH, SQLFetch restituisce SQL_SUCCESS e non restituisce SQLSTATE 01S07 (troncamento frazionario) o SQLSTATE 01004 (dati troncati). Se i dati vengono troncati durante la conversione con una perdita di cifre significative (ad esempio, se un valore SQL_INTEGER maggiore di 100.000 è stato convertito in un SQL_C_TINYINT), SQLFetch restituisce SQLSTATE 22003 (valore numerico non compreso nell'intervallo) e SQL_ERROR (se la dimensione del set di righe è 1) o SQL_SUCCESS_WITH_INFO (se la dimensione del set di righe è maggiore di 1).

Il contenuto del buffer di dati associato e del buffer di lunghezza/indicatore non è definito se SQLFetch o SQLFetchScroll non restituisce SQL_SUCCESS o SQL_SUCCESS_WITH_INFO.

Matrice di stato riga

La matrice di stato della riga viene utilizzata per restituire lo stato di ogni riga nel set di righe. L'indirizzo di questa matrice viene specificato con l'attributo dell'istruzione SQL_ATTR_ROW_STATUS_PTR. La matrice viene allocata dall'applicazione e deve avere il numero di elementi specificato dall'attributo dell'istruzione SQL_ATTR_ROW_ARRAY_SIZE. I relativi valori vengono impostati da SQLFetch, SQLFetchScroll e SQLBulkOperations o SQLSetPos (tranne quando sono stati chiamati dopo che il cursore è stato posizionato da SQLExtendedFetch). Se il valore dell'attributo dell'istruzione SQL_ATTR_ROW_STATUS_PTR è un puntatore Null, queste funzioni non restituiscono lo stato della riga.

Il contenuto del buffer della matrice di stato della riga non è definito se SQLFetch o SQLFetchScroll non restituisce SQL_SUCCESS o SQL_SUCCESS_WITH_INFO.

Nella matrice di stato della riga vengono restituiti i valori seguenti.

Valore della matrice di stato riga Descrizione
SQL_ROW_SUCCESS La riga è stata recuperata correttamente e non è stata modificata dopo l'ultimo recupero da questo set di risultati.
SQL_ROW_SUCCESS_WITH_INFO La riga è stata recuperata correttamente e non è stata modificata dopo l'ultimo recupero da questo set di risultati. Tuttavia, è stato restituito un avviso relativo alla riga.
SQL_ROW_ERROR Errore durante il recupero della riga.
SQL_ROW_UPDATED[1],[2], e [3] La riga è stata recuperata e modificata dopo l'ultimo recupero da questo set di risultati. Se la riga viene recuperata nuovamente da questo set di risultati o viene aggiornata da SQLSetPos, lo stato viene modificato nel nuovo stato della riga.
SQL_ROW_DELETED[3] La riga è stata eliminata dopo l'ultimo recupero da questo set di risultati.
SQL_ROW_ADDED[4] La riga è stata inserita da SQLBulkOperations. Se la riga viene recuperata nuovamente da questo set di risultati o viene aggiornata da SQLSetPos, il relativo stato viene SQL_ROW_SUCCESS.
SQL_ROW_NOROW Il set di righe si sovrappone alla fine del set di risultati e non viene restituita alcuna riga corrispondente a questo elemento della matrice di stato della riga.

[1] Per i cursori keyset, misti e dinamici, se viene aggiornato un valore di chiave, la riga di dati viene considerata eliminata e viene aggiunta una nuova riga.

[2] Alcuni driver non possono rilevare gli aggiornamenti dei dati e pertanto non possono restituire questo valore. Per determinare se un driver può rilevare gli aggiornamenti per recuperare le righe recuperate, un'applicazione chiama SQLGetInfo con l'opzione SQL_ROW_UPDATES.

[3] SQLFetch può restituire questo valore solo quando viene combinato con le chiamate a SQLFetchScroll. Questo perché SQLFetch si sposta avanti nel set di risultati e quando viene usato esclusivamente, non esegue il refetch di alcuna riga. Poiché non vengono recuperate righe, SQLFetch non rileva le modifiche apportate alle righe recuperate in precedenza. Tuttavia, se SQLFetchScroll posiziona il cursore prima di qualsiasi riga recuperata in precedenza e SQLFetch viene usato per recuperare tali righe, SQLFetch può rilevare eventuali modifiche a tali righe.

[4] Restituito solo da SQLBulkOperations. Non impostato da SQLFetch o SQLFetchScroll.

Buffer recuperato righe

Il buffer recuperato dalle righe viene usato per restituire il numero di righe recuperate, incluse quelle per cui non sono stati restituiti dati perché si è verificato un errore durante il recupero. In altre parole, è il numero di righe per cui il valore nella matrice di stato della riga non è SQL_ROW_NOROW. L'indirizzo di questo buffer viene specificato con l'attributo dell'istruzione SQL_ATTR_ROWS_FETCHED_PTR. Il buffer viene allocato dall'applicazione. Viene impostato da SQLFetch e SQLFetchScroll. Se il valore dell'attributo dell'istruzione SQL_ATTR_ROWS_FETCHED_PTR è un puntatore Null, queste funzioni non restituiscono il numero di righe recuperate. Per determinare il numero della riga corrente nel set di risultati, un'applicazione può chiamare SQLGetStmtAttr con l'attributo SQL_ATTR_ROW_NUMBER.

Il contenuto del buffer recuperato dalle righe non è definito se SQLFetch o SQLFetchScroll non restituisce SQL_SUCCESS o SQL_SUCCESS_WITH_INFO, tranne quando viene restituito SQL_NO_DATA, nel qual caso il valore nel buffer recuperato nelle righe è impostato su 0.

Gestione degli errori

Gli errori e gli avvisi possono essere applicati a singole righe o all'intera funzione. Per altre informazioni sui record di diagnostica, vedere Diagnostica e SQLGetDiagField.

Errori e avvisi sull'intera funzione

Se si verifica un errore per l'intera funzione, ad esempio SQLSTATE HYT00 (timeout scaduto) o SQLSTATE 24000 (stato cursore non valido), SQLFetch restituisce SQL_ERROR e l'istanza di SQLSTATE applicabile. Il contenuto dei buffer del set di righe non è definito e la posizione del cursore rimane invariata.

Se si applica un avviso all'intera funzione, SQLFetch restituisce SQL_SUCCESS_WITH_INFO e l'istanza di SQLSTATE applicabile. I record di stato per gli avvisi che si applicano all'intera funzione vengono restituiti prima dei record di stato applicabili alle singole righe.

Errori e avvisi in singole righe

Se si verifica un errore ( ad esempio SQLSTATE 22012 (divisione per zero)) o un avviso (ad esempio SQLSTATE 01004 (troncato dai dati)) si applica a una singola riga, SQLFetchesegue le operazioni seguenti:

  • Imposta l'elemento corrispondente della matrice di stato della riga su SQL_ROW_ERROR per gli errori o SQL_ROW_SUCCESS_WITH_INFO per gli avvisi.

  • Aggiunge zero o più record di stato che contengono SQLSTATEs per l'errore o l'avviso.

  • Imposta i campi dei numeri di riga e colonna nei record di stato. Se SQLFetch non è in grado di determinare un numero di riga o di colonna, imposta tale numero rispettivamente su SQL_ROW_NUMBER_UNKNOWN o SQL_COLUMN_NUMBER_UNKNOWN. Se il record di stato non si applica a una determinata colonna, SQLFetch imposta il numero di colonna su SQL_NO_COLUMN_NUMBER.

SQLFetch continua a recuperare righe fino a quando non ha recuperato tutte le righe nel set di righe. Restituisce SQL_SUCCESS_WITH_INFO a meno che non si verifichi un errore in ogni riga del set di righe (non incluse le righe con stato SQL_ROW_NOROW), nel qual caso restituisce SQL_ERROR. In particolare, se la dimensione del set di righe è 1 e si verifica un errore in tale riga, SQLFetch restituisce SQL_ERROR.

SQLFetch restituisce i record di stato nell'ordine dei numeri di riga. Ovvero restituisce tutti i record di stato per le righe sconosciute (se presenti); successivamente restituisce tutti i record di stato per la prima riga (se presente) e quindi restituisce tutti i record di stato per la seconda riga (se presente) e così via. I record di stato per ogni riga vengono ordinati in base alle normali regole per l'ordinamento dei record di stato; Per altre informazioni, vedere "Sequenza di record di stato" in SQLGetDiagField.

Descrittori e SQLFetch

Le sezioni seguenti descrivono come SQLFetch interagisce con i descrittori.

Mapping degli argomenti

Il driver non imposta alcun campo descrittore in base agli argomenti di SQLFetch.

Altri campi descrittori

I campi descrittori seguenti vengono usati da SQLFetch.

Campo di descrizione Desc. Campo in Imposta tramite
SQL_DESC_ARRAY_SIZE ARD di autorizzazione attributo istruzione SQL_ATTR_ROW_ARRAY_SIZE
SQL_DESC_ARRAY_STATUS_PTR IRD di autorizzazione attributo dell'istruzione SQL_ATTR_ROW_STATUS_PTR
SQL_DESC_BIND_OFFSET_PTR ARD di autorizzazione Attributo dell'istruzione SQL_ATTR_ROW_BIND_OFFSET_PTR
SQL_DESC_BIND_TYPE ARD di autorizzazione attributo di istruzione SQL_ATTR_ROW_BIND_TYPE
SQL_DESC_COUNT ARD di autorizzazione Argomento ColumnNumber di SQLBindCol
SQL_DESC_DATA_PTR ARD record Argomento TargetValuePtr di SQLBindCol
SQL_DESC_INDICATOR_PTR ARD record argomento StrLen_or_IndPtr in SQLBindCol
SQL_DESC_OCTET_LENGTH ARD record Argomento BufferLength in SQLBindCol
SQL_DESC_OCTET_LENGTH_PTR ARD record argomento StrLen_or_IndPtr in SQLBindCol
SQL_DESC_ROWS_PROCESSED_PTR IRD di autorizzazione attributo dell'istruzione SQL_ATTR_ROWS_FETCHED_PTR
SQL_DESC_TYPE ARD record Argomento TargetType in SQLBindCol

Tutti i campi descrittori possono essere impostati anche tramite SQLSetDescField.

Buffer di lunghezza e indicatore separati

Le applicazioni possono associare un singolo buffer o due buffer separati che possono essere usati per contenere valori di lunghezza e indicatore. Quando un'applicazione chiama SQLBindCol, il driver imposta i campi SQL_DESC_OCTET_LENGTH_PTR e SQL_DESC_INDICATOR_PTR della ARD sullo stesso indirizzo, che viene passato nell'argomento StrLen_or_IndPtr . Quando un'applicazione chiama SQLSetDescField o SQLSetDescRec, può impostare questi due campi su indirizzi diversi.

SQLFetch determina se l'applicazione ha specificato buffer di lunghezza e indicatore separati. In questo caso, quando i dati non sono NULL, SQLFetch imposta il buffer dell'indicatore su 0 e restituisce la lunghezza nel buffer di lunghezza. Quando i dati sono NULL, SQLFetch imposta il buffer dell'indicatore su SQL_NULL_DATA e non modifica il buffer di lunghezza.

Esempio di codice

Vedere SQLBindCol, SQLColumns, SQLGetData e SQLProcedures.

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
Esecuzione di un'istruzione SQL Funzione SQLExecDirect
Esecuzione di un'istruzione SQL preparata Funzione SQLExecute
Recupero di un blocco di dati o scorrimento di un set di risultati Funzione SQLFetchScroll
Chiusura del cursore sull'istruzione Funzione SQLFreeStmt
Recupero di una parte o di una colonna di dati Funzione SQLGetData
Restituzione del numero di colonne del set di risultati Funzione SQLNumResultCols
Preparazione di un'istruzione per l'esecuzione Funzione SQLPrepare

Vedi anche

Riferimento API ODBC
File di intestazione ODBC