Condividi tramite


Modifica di righe con operazioni posizionate

I cursori aggiornabili supportano le istruzioni per la modifica dei dati che eseguono l'aggiornamento delle righe tramite il cursore. Quando si è posizionati su una riga in un cursore aggiornabile, è possibile eseguire operazioni di aggiornamento o eliminazione da implementare nelle righe della tabella di base utilizzate per l'impostazione della riga corrente nel cursore. Queste operazioni sono definite aggiornamenti posizionati.

Gli aggiornamenti posizionati vengono eseguiti sulla stessa connessione utilizzata per l'apertura del cursore. In questo modo, le modifiche dei dati possono condividere lo stesso spazio della transazione del cursore e viene impedito il blocco degli aggiornamenti tramite i blocchi mantenuti attivi dal cursore stesso.

È possibile eseguire gli aggiornamenti posizionati in un cursore in due modi:

  • Tramite la clausola Transact-SQL WHERE CURRENT OF in un'istruzione UPDATE o DELETE.
  • Tramite una funzione o un metodo di aggiornamento posizionato di un'API di database, ad esempio la funzione ODBC SQLSetPos.

Aggiornamenti posizionati con Transact-SQL

La clausola Transact-SQL WHERE CURRENT OF viene in genere utilizzata in stored procedure, trigger e script Transact-SQL quando è necessario apportare modifiche in base a righe specifiche di un cursore. La stored procedure, il trigger o lo script esegue le operazioni seguenti:

  • Esegue le istruzioni DECLARE e OPEN per dichiarare e aprire un cursore.
  • Utilizza le istruzioni FETCH per il posizionamento su una riga del cursore.
  • Esegue un'istruzione UPDATE o DELETE utilizzando la clausola WHERE CURRENT OF. Come paramento cursor_name della clausola WHERE CURRENT OF, utilizzare il valore del parametro cursor_name dell'istruzione DECLARE.

Aggiornamenti posizionati con le API

I cursori creati con le funzioni e i metodi OLE DB e ADO non vengono utilizzati nelle clausole WHERE CURRENT OF, perché non hanno un nome. In ODBC è tuttavia possibile assegnare un nome a un cursore API del server mediante la funzione SQLGetCursorName. Dopo aver impostato gli attributi del cursore e aver aperto un cursore tramite un'istruzione Transact-SQL, utilizzare la funzione SQLGetCursorName per ottenere un nome per il cursore. Dopo avere eseguito il posizionamento nel cursore, eseguire un'istruzione UPDATE o DELETE con una clausola WHERE CURRENT OF in cui viene fatto riferimento al nome restituito da SQLGetCursorName. È tuttavia consigliabile non adottare questo metodo. È invece consigliabile utilizzare le funzioni di aggiornamento posizionato dell'API ODBC.

Le API di database supportano due sistemi diversi per l'esecuzione di operazioni posizionate sui cursori API del server. ODBC supporta un modello, mentre OLE DB e ADO ne supportano un altro.

In ODBC, è necessario associare le colonne del cursore alle variabili di programma ed eseguire quindi il posizionamento su una riga specifica del cursore. Se si esegue un aggiornamento posizionato, sostituire i valori dei dati delle variabili di programma con i nuovi valori. Per eseguire l'operazione posizionata, chiamare la funzione SQLSetPos.

Per questa funzione sono disponibili le opzioni seguenti:

SQLSetPos(SQL_POSITION)

Solo in ODBC, posiziona il cursore ODBC su una riga specifica del set di righe corrente.

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

SQLSetPos(SQL_UPDATE)

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

SQLSetPos(SQL_DELETE)

Elimina la riga corrente dal cursore.

Per gli aggiornamenti posizionati in OLE DB e ADO viene adottato un modello diverso.

In OLE DB, dopo essersi posizionati su una riga del set di righe, chiamare il metodo IRowsetChange::SetData o IRowsetChange::DeleteRows per eseguire gli aggiornamenti posizionati. Se il provider OLE DB supporta IRowsetUpdate::Update, le modifiche apportate tramite i metodi IRowsetChange vengono inserite nella cache fino a quando non si chiama il metodo IRowsetUpdate::Update. In caso contrario, le modifiche apportate con i metodi IRowsetChange vengono applicate immediatamente.

In ADO, dopo essersi posizionati su una riga di un set di record, chiamare il metodo Update o Delete dell'oggetto Recordset. Se il provider OLE DB supporta IRowsetUpdate::Update, le modifiche apportate tramite i metodi Update o Delete dell'oggetto Recordset vengono inserite nella cache fino a quando non si chiama il metodo UpdateBatch dell'oggetto Recordset. In caso contrario, le modifiche apportate con i metodi Update o Delete dell'oggetto Recordset vengono applicate immediatamente.

Vedere anche

Altre risorse

WHERE (Transact-SQL)
Positioned Updates (ODBC)

Guida in linea e informazioni

Assistenza su SQL Server 2005