Recordset: ulteriori informazioni sugli aggiornamenti (ODBC)

Le informazioni contenute in questo argomento sono valide per le classi ODBC MFC.

In questo argomento:

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 AddNewfunzioni membro , EditDelete, 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 AddNewfunziona , Edite Delete , è importante comprendere come funzionano le BeginTransfunzioni membro , CommitTranse 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 Updateprima , CommitTranso 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 che Editper AddNew .

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 chiamare Update di nuovo.

  • Chiamare Edit per ricaricare i valori presenti nel recordset prima della prima chiamata a AddNew o Edit, impostare i valori dei membri dati del campo e quindi chiamare Update di nuovo. Dopo una chiamata riuscita Update (tranne dopo una AddNew chiamata), i membri dati del campo mantengono i nuovi valori.

  • Chiamare Move (incluso Move con un parametro di AFX_MOVE_REFRESH o 0), che scarica tutte le modifiche e termina qualsiasi AddNew modalità o Edit in vigore.

Aggiornare ed eliminare

Questa sezione si applica sia a che Deletea 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