Recordset: ulteriori informazioni sugli aggiornamenti (ODBC)
Le informazioni contenute in questo argomento sono valide per le classi ODBC MFC.
In questo argomento:
In che modo altre operazioni, ad esempio le transazioni, influiscono sugli aggiornamenti.
Altre informazioni sulle funzioni membro Update e Delete.
Nota
Questo argomento si applica agli oggetti derivati da CRecordset
in cui non è stato implementato il recupero di massa di righe. Se è stato implementato il recupero di righe bulk, alcune delle informazioni non si applicano. Ad esempio, non è possibile chiamare le AddNew
funzioni membro , Edit
Delete
, e Update
, ma è possibile eseguire transazioni. Per altre informazioni sul recupero delle righe bulk, vedere Recordset: recupero di record in blocco (ODBC).
Impatto di altre operazioni sugli aggiornamenti
Gli aggiornamenti sono interessati dalle transazioni in vigore al momento dell'aggiornamento, chiudendo il recordset prima di completare una transazione e scorrendo prima di completare una transazione.
Impatto delle transazioni sugli aggiornamenti
Oltre a comprendere come AddNew
funziona , Edit
e Delete
, è importante comprendere come funzionano le BeginTrans
funzioni membro , CommitTrans
e Rollback
di CDatabase con le funzioni di aggiornamento di CRecordset.
Per impostazione predefinita, le chiamate a AddNew
e Edit
influiscono immediatamente sull'origine dati quando si chiama Update
. Delete
le chiamate diventano effettive immediatamente. È tuttavia possibile stabilire una transazione ed eseguire un batch di tali chiamate. Gli aggiornamenti non sono permanenti fino a quando non vengono confermati. Se si cambia idea, è possibile eseguire il rollback della transazione anziché eseguirne il commit.
Per altre informazioni sulle transazioni, vedere Transaction (ODBC).For more information about transactions, see Transaction (ODBC).
Impatto della chiusura dell'oggetto Recordset sugli aggiornamenti
Se si chiude un recordset o l'oggetto associato CDatabase
, con una transazione in corso (non è stata chiamata CDatabase::CommitTrans o CDatabase::Rollback), viene eseguito automaticamente il rollback della transazione (a meno che il back-end del database non sia il motore di database Microsoft Jet).
Attenzione
Se si usa il motore di database Microsoft Jet, la chiusura di un recordset all'interno di una transazione esplicita non comporta il rilascio di alcuna delle righe modificate o blocchi inseriti fino a quando non viene eseguito il commit o il rollback della transazione esplicita. È consigliabile aprire e chiudere sempre recordset all'interno o all'esterno di una transazione Jet esplicita.
Impatto dello scorrimento sugli aggiornamenti
Quando si esegue recordset: scorrimento (ODBC) in un recordset, il buffer di modifica viene riempito con ogni nuovo record corrente (il record precedente non viene archiviato per primo). Lo scorrimento ignora i record eliminati in precedenza. Se si scorre dopo una AddNew
chiamata o Edit
senza chiamare Update
prima , CommitTrans
o Rollback
, eventuali modifiche andranno perse (senza alcun avviso) perché un nuovo record viene inserito nel buffer di modifica. Il buffer di modifica viene riempito con il record a cui è stato eseguito lo scorrimento, il record archiviato viene liberato e non viene apportata alcuna modifica nell'origine dati. Questo vale sia per AddNew
che per Edit
.
Aggiornamenti e aggiornamenti di altri utenti
Quando si usa un recordset per aggiornare i dati, gli aggiornamenti influiscono su altri utenti. Analogamente, gli aggiornamenti di altri utenti durante la durata del recordset influiscono sull'utente.
In un ambiente multiutente, altri utenti possono aprire recordset contenenti alcuni degli stessi record selezionati nel recordset. Le modifiche apportate a un record prima di recuperarlo vengono riflesse nel recordset. Poiché i dynaset recuperano un record ogni volta che si scorre verso di esso, i dynaset riflettono le modifiche ogni volta che si scorre un record. Gli snapshot recuperano un record la prima volta che si scorre verso di esso, quindi gli snapshot riflettono solo le modifiche che si verificano prima di scorrere il record inizialmente.
I record aggiunti da altri utenti dopo l'apertura del recordset non vengono visualizzati nel recordset, a meno che non si esegua una query. Se il recordset è un dynaset, le modifiche apportate ai record esistenti da altri utenti vengono visualizzate nel dynaset quando si scorre il record interessato. Se il recordset è uno snapshot, le modifiche non verranno visualizzate finché non si rieseguirà la query sullo snapshot. Se si desidera visualizzare i record aggiunti o eliminati da altri utenti nello snapshot o i record aggiunti da altri utenti nel dynaset, chiamare CRecordset::Requery per ricompilare il recordset. Si noti che le eliminazioni di altri utenti vengono visualizzate nel dynaset. È anche possibile chiamare Requery
per visualizzare i record aggiunti, ma non per visualizzare le eliminazioni.
Suggerimento
Per forzare la memorizzazione nella cache di un intero snapshot contemporaneamente, chiamare MoveLast
immediatamente dopo l'apertura dello snapshot. Chiamare MoveFirst
quindi per iniziare a lavorare con i record. MoveLast
equivale allo scorrimento di tutti i record, ma li recupera tutti contemporaneamente. Si noti, tuttavia, che questo può ridurre le prestazioni e potrebbe non essere necessario per alcuni driver.
Gli effetti degli aggiornamenti su altri utenti sono simili ai loro effetti su di te.
Altre informazioni sull'aggiornamento e l'eliminazione
In questa sezione vengono fornite informazioni aggiuntive che consentono di usare Update
e Delete
.
Aggiornamento riuscito e negativo
Se Update
ha esito positivo, termina la AddNew
modalità o Edit
. Per avviare di nuovo una AddNew
modalità o Edit
, chiamare AddNew
o Edit
.
Se Update
ha esito negativo (restituisce FALSE o genera un'eccezione), si rimane in AddNew
modalità o Edit
, a seconda della funzione chiamata per ultima. A quel punto, è possibile eseguire una di queste operazioni:
Modificare un membro dati del campo e riprovare
Update
.Chiamare
AddNew
per reimpostare i membri dati del campo su Null, impostare i valori dei membri dati del campo e quindi chiamareUpdate
di nuovo.Chiamare
Edit
per ricaricare i valori presenti nel recordset prima della prima chiamata aAddNew
oEdit
, impostare i valori dei membri dati del campo e quindi chiamareUpdate
di nuovo. Dopo una chiamata riuscitaUpdate
(tranne dopo unaAddNew
chiamata), i membri dati del campo mantengono i nuovi valori.Chiamare
Move
(inclusoMove
con un parametro di AFX_MOVE_REFRESH o 0), che scarica tutte le modifiche e termina qualsiasiAddNew
modalità oEdit
in vigore.
Aggiornare ed eliminare
Questa sezione si applica sia a che Delete
a Update
.
In un'operazione Update
o Delete
è necessario aggiornare uno e un solo record. Tale record è il record corrente, che corrisponde ai valori dei dati nei campi del recordset. Se per qualche motivo non sono interessati record o più record sono interessati, viene generata un'eccezione contenente uno dei valori RETCODE seguenti:
AFX_SQL_ERROR_NO_ROWS_AFFECTED
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED
Quando vengono generate queste eccezioni, si rimane nello AddNew
stato o Edit
in cui ci si trovava quando si chiama Update
o Delete
. Ecco gli scenari più comuni in cui vengono visualizzate queste eccezioni. È molto probabile che venga visualizzato:
AFX_SQL_ERROR_NO_ROWS_AFFECTED quando si usa la modalità di blocco ottimistica e un altro utente ha modificato il record in modo da impedire al framework di identificare il record corretto da aggiornare o eliminare.
AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED quando la tabella da aggiornare non ha una chiave primaria o un indice univoco e non sono presenti colonne sufficienti nel recordset per identificare in modo univoco una riga di tabella.
Vedi anche
Recordset (ODBC)
Recordset: selezione dei record (ODBC)
Trasferimento di campi di record (RFX)
SQL
Eccezioni: eccezioni di database