Condividi tramite


Costruzione di istruzioni di ricerca

Importante

Questa funzionalità verrà rimossa nelle versioni future 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 ed eliminazione posizionate, la libreria di cursori costruisce un'istruzione UPDATE o DELETE ricercata dall'istruzione posizionata. Per supportare le chiamate a SQLGetData in un blocco di dati, la libreria di cursori costruisce un'istruzione SELECT cercata per creare un set di risultati contenente la riga di dati corrente. In ognuna di queste istruzioni, la clausola WHERE enumera i valori archiviati nella cache per ogni colonna associata che restituisce SQL_PRED_SEARCHABLE o SQL_PRED_BASIC per l'identificatore di campo SQL_DESC_SEARCHABLE in SQLColAttribute.

Attenzione

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

Se un'istruzione di aggiornamento o eliminazione posizionata influisce su più righe, la libreria di cursori aggiorna la matrice di stato della riga solo per la riga in cui è posizionato il cursore e restituisce SQL_SUCCESS_WITH_INFO e SQLSTATE 01001 (conflitto di operazioni cursori). Se l'istruzione non identifica righe, la libreria di cursori non aggiorna la matrice di stato della riga e restituisce SQL_SUCCESS_WITH_INFO e SQLSTATE 01001 (conflitto dell'operazione cursore). Un'applicazione può chiamare SQLRowCount per determinare il numero di righe aggiornate o eliminate.

Se la clausola SELECT usata per posizionare il cursore per una chiamata a SQLGetData identifica più righe, SQLGetData non garantisce la restituzione dei dati corretti. Se non identifica alcuna riga, SQLGetData restituisce SQL_NO_DATA.

Se un'applicazione è conforme alle linee guida seguenti, la clausola WHERE costruita dalla libreria di cursori deve identificare in modo univoco la riga corrente, tranne quando è impossibile, ad esempio quando l'origine dati contiene righe duplicate.

  • Associare colonne che identificano in modo univoco la riga. Se le colonne associate non identificano in modo univoco la riga, la clausola WHERE costruita dalla libreria di cursori potrebbe identificare più righe. In un'istruzione update o delete posizionata, tale clausola potrebbe causare l'aggiornamento o l'eliminazione di più righe. In una chiamata a SQLGetData, tale clausola potrebbe causare la restituzione dei dati del driver per la riga errata. L'associazione di tutte le colonne in una chiave univoca garantisce che ogni riga venga identificata in modo univoco.

  • Allocare buffer di dati di grandi dimensioni in modo che non si verifichi alcun troncamento. La cache della libreria di cursori è una copia dei valori nei buffer del set di righe associati 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 nell'origine dati.

  • Specificare buffer di lunghezza non Null per i dati C binari. La libreria di cursori alloca i buffer di lunghezza nella cache solo se l'argomento StrLen_or_IndPtr in SQLBindCol non è null. 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 è presente alcun buffer di lunghezza per una colonna SQL_C_BINARY e l'applicazione chiama SQLGetData o tenta di eseguire un'istruzione di aggiornamento o eliminazione posizionata, la libreria di cursori restituisce SQL_ERROR e SQLSTATE SL014 (è stata eseguita una richiesta posizionata e non tutti i campi del conteggio delle colonne sono stati memorizzati nel buffer).

  • Specificare buffer di lunghezza non Null per le colonne nullable. La libreria di cursori alloca i buffer di lunghezza nella cache solo se l'argomento StrLen_or_IndPtr in SQLBindCol non è null. Poiché SQL_NULL_DATA viene archiviato nel buffer di lunghezza, la libreria di cursori presuppone che qualsiasi colonna per cui non è specificato alcun buffer di lunghezza sia non nullable. Se non viene specificata alcuna colonna di lunghezza per una colonna nullable, la libreria di cursori costruisce una clausola WHERE che utilizza il valore di dati per la colonna. Questa clausola non identificherà correttamente la riga.