Formulazione di dichiarazioni di ricerca

Importante

Questa funzionalità verrà rimossa in una versione futura di Windows. Evitare di usare questa funzionalità nel nuovo lavoro di sviluppo e pianificare la modifica delle applicazioni che attualmente usano questa funzionalità. Microsoft consiglia di usare la funzionalità cursore del driver.

Per supportare istruzioni di aggiornamento e cancellazione posizionate, la libreria di cursori costruisce una istruzione o ricercata UPDATEDELETE dall'istruzione posizionata. Per supportare le chiamate a SQLGetData in un blocco di dati, la libreria di cursori costruisce un'istruzione SELECT ricercata per creare un insieme di risultati contenente la riga di dati corrente. In ciascuna di queste istruzioni, la clausola WHERE enumera i valori memorizzati nella cache per ogni colonna legata che restituisce SQL_PRED_SEARCHABLE o SQL_PRED_BASIC per l'identificatore di campo SQL_DESC_SEARCHABLE in SQLColAttribute.

Caution

La clausola WHERE costruita dalla libreria di cursori per identificare la riga corrente può non identificare righe, identificare una riga diversa o identificare più di una riga.

Se una istruzione aggiornamento o cancellazione posizionata riguarda più di una riga, la libreria di cursori aggiorna l'array di stato delle righe solo per la riga su cui il cursore è posizionato e restituisce SQL_SUCCESS_WITH_INFO e SQLSTATE 01001 (conflitto di operazione cursore). Se l'istruzione non identifica righe, la libreria di cursori non aggiorna l'array di stato delle righe e restituisce SQL_SUCCESS_WITH_INFO e SQLSTATE 01001 (conflitto di operazione cursore). Un'applicazione può chiamare SQLRowCount per determinare il numero di righe che sono state aggiornate o eliminate.

Se la clausola SELECT usata per posizionare il cursore per una chiamata a SQLGetData identifica più di una riga, SQLGetData non è garantito che restituisca i dati corretti. Se non identifica righe, SQLGetData restituisce SQL_NO_DATA.

Se un'applicazione rispetta le seguenti linee guida, la clausola WHERE costruita dalla libreria di cursori dovrebbe identificare in modo univoco la riga corrente, tranne quando ciò è impossibile, ad esempio quando la sorgente dati contiene righe duplicate.

  • Associare colonne che identificano unicamente la riga. Se le colonne legate non identificano unicamente la riga, la clausola WHERE costruita dalla libreria di cursori potrebbe identificare più di una riga. In un'istruzione aggiornamento o cancellazione posizionata, tale clausola potrebbe far sì che più di una riga venga aggiornata o cancellata. In una chiamata a SQLGetData, una clausola del genere potrebbe far sì che il driver restituisca dati per la riga sbagliata. Associare tutte le colonne in una chiave unica garantisce che ogni riga sia identificata in modo univoco.

  • Alloca buffer dati abbastanza grandi da non verificare troncamento. La cache della libreria di cursori è una copia dei valori nei buffer del rowset legati al set di risultati con SQLBindCol. Se i dati vengono troncati quando vengono inseriti in questi buffer, verranno troncati anche nella cache. Una clausola WHERE costruita da valori troncati potrebbe non identificare correttamente la riga sottostante nella sorgente dati.

  • Specificare buffer non a lunghezza nulla per i dati binari C. La libreria di cursori alloca buffer di lunghezza nella sua cache solo se l'argomento StrLen_or_IndPtr in SQLBindCol è non nullo. Quando l'argomento TargetType è SQL_C_BINARY, la libreria di cursori richiede la lunghezza dei dati binari per costruire una clausola WHERE dai dati. Se non c'è un buffer di lunghezza per una colonna SQL_C_BINARY e l'applicazione chiama SQLGetData o tenta di eseguire un'istruzione aggiornamento o cancellazione posizionata, la libreria di cursori restituisce SQL_ERROR e SQLSTATE SL014 (è stata emessa una richiesta posizionata e non tutti i campi per il conteggio delle colonne sono stati bufferizzati).

  • Specificare buffer non a lunghezza nulla per colonne nullabili. La libreria di cursori alloca buffer di lunghezza nella sua cache solo se l'argomento StrLen_or_IndPtr in SQLBindCol è non nullo. Poiché SQL_NULL_DATA è memorizzato nel buffer di lunghezza, la libreria di cursori assume che qualsiasi colonna per la quale non è specificato alcun buffer di lunghezza sia non nullabile. Se non viene specificata alcuna colonna di lunghezza per una colonna nullabile, la libreria di cursori costruisce una clausola WHERE che utilizza il valore dei dati per la colonna. Questa clausola non identificherà correttamente la riga.