Aggiornamenti posizionati (ODBC)

Si applica a: SQL Server database SQL di Azure Istanza gestita di SQL di Azure azure Synapse Analytics Analytics Platform System (PDW)

In ODBC sono supportati due metodi per eseguire gli aggiornamenti posizionati in un cursore:

  • SQLSetPos

  • Clausola WHERE CURRENT OF

L'approccio più comune consiste nell'usare SQLSetPos. che dispone delle opzioni seguenti.

SQL_POSITION
Posiziona il cursore in una riga specifica del set di righe corrente.

SQL_REFRESH
Aggiorna le variabili di programma associate alle colonne del set di risultati in base ai valori della riga su cui è posizionato il cursore.

SQL_UPDATE
Aggiorna la riga corrente del cursore con i valori archiviati nelle variabili di programma associate alle colonne del set di risultati.

SQL_DELETE
Elimina la riga corrente dal cursore.

È possibile usare SQLSetPos con qualsiasi set di risultati dell'istruzione quando gli attributi del cursore dell'handle di istruzione vengono impostati per l'uso dei cursori del server. Le colonne del set di risultati devono essere associate a variabili di programma. Non appena l'applicazione ha recuperato una riga, chiama SQLSetPos(SQL_POSTION) per posizionare il cursore sulla riga. È possibile quindi chiamare SQLSetPos (SQL_DELETE) per eliminare la riga corrente o spostare i nuovi valori dei dati nelle variabili di programma associate e chiamare SQLSetPos (SQL_UPDATE) per aggiornare la riga corrente.

Le applicazioni possono aggiornare o eliminare qualsiasi riga nel set di righe con SQLSetPos. La chiamata a SQLSetPos è un'alternativa pratica alla costruzione e all'esecuzione di un'istruzione SQL. SQLSetPos opera sul set di righe corrente e può essere usato solo dopo una chiamata a SQLFetchScroll.

Le dimensioni del set di righe vengono impostate da una chiamata a SQLSetStmtAttr con un argomento attributo di SQL_ATTR_ROW_ARRAY_SIZE. SQLSetPos usa una nuova dimensione del set di righe, ma solo dopo una chiamata a SQLFetch o SQLFetchScroll. Ad esempio, se le dimensioni del set di righe vengono modificate, viene chiamato SQLSetPos e quindi viene chiamato SQLFetch o SQLFetchScroll . La chiamata a SQLSetPos usa le dimensioni del set di righe precedente, ma SQLFetch o SQLFetchScroll usa le nuove dimensioni del set di righe.

La prima riga nel set di righe è il numero di riga 1. L'argomento RowNumber in SQLSetPos deve identificare una riga nel set di righe, ovvero il relativo valore deve essere compreso nell'intervallo compreso tra 1 e il numero di righe recuperate più di recente. Questo valore potrebbe essere inferiore alle dimensioni del set di righe. Se RowNumber è 0, l'operazione viene applicata a ogni riga nel set di righe.

L'operazione di eliminazione di SQLSetPos comporta l'eliminazione di una o più righe selezionate di una tabella da parte dell'origine dati. Per eliminare righe con SQLSetPos, l'applicazione chiama SQLSetPos con Operation impostato su SQL_DELETE e RowNumber impostato sul numero della riga da eliminare. Se RowNumber è 0, tutte le righe nel set di righe vengono eliminate.

Al termine della restituzione di SQLSetPos, la riga eliminata è la riga corrente e il relativo stato è SQL_ROW_DELETED. La riga non può essere usata in altre operazioni posizionate, ad esempio le chiamate a SQLGetData o SQLSetPos.

Quando si eliminano tutte le righe del set di righe (RowNumber è uguale a 0), l'applicazione può impedire al driver di eliminare determinate righe usando la matrice di operazioni di riga esattamente come per l'operazione di aggiornamento di SQLSetPos.

Ogni riga eliminata deve essere una riga che esiste nel set di risultati. Se dopo il recupero i buffer dell'applicazione risultano pieni e se è stata conservata una matrice di stato della riga, i valori in ognuna di queste posizioni delle righe non devono essere SQL_ROW_DELETED, SQL_ROW_ERROR o SQL_ROW_NOROW.

Gli aggiornamenti posizionati possono inoltre essere eseguiti utilizzando la clausola WHERE CURRENT OF nelle istruzioni UPDATE, DELETE e INSERT. WHERE CURRENT OF richiede un nome di cursore che ODBC genererà quando viene chiamata la funzione SQLGetCursorName o che è possibile specificare chiamando SQLSetCursorName. Di seguito sono riportati i passaggi generali utilizzati per eseguire un aggiornamento di WHERE CURRENT OF in un'applicazione ODBC:

  • Chiamare SQLSetCursorName per stabilire un nome di cursore per l'handle di istruzione.

  • Compilare un'istruzione SELECT con una clausola FOR UPDATE OF ed eseguirla.

  • Chiamare SQLFetchScroll per recuperare un set di righe o SQLFetch per recuperare una riga.

  • Chiamare SQLSetPos (SQL_POSITION) per posizionare il cursore sulla riga.

  • Compilare ed eseguire un'istruzione UPDATE con una clausola WHERE CURRENT OF usando il nome del cursore impostato con SQLSetCursorName.

In alternativa, è possibile chiamare SQLGetCursorName dopo aver eseguito l'istruzione SELECT anziché chiamare SQLSetCursorName prima di eseguire l'istruzione SELECT. SQLGetCursorName restituisce un nome di cursore predefinito assegnato da ODBC se non si imposta un nome di cursore usando SQLSetCursorName.

SQLSetPos è preferibile rispetto a WHERE CURRENT OF quando si usano cursori server. Se si utilizza un cursore statico aggiornabile con la libreria di cursore ODBC, la libreria di cursori implementa gli aggiornamenti di WHERE CURRENT OF aggiungendo una clausola WHERE con i valori chiave per la tabella sottostante. Se le chiavi nella tabella non sono univoche, possono verificarsi aggiornamenti non desiderati.

Vedi anche

Uso dei cursori (ODBC)