Recordset: aggiunta, aggiornamento ed eliminazione di record (ODBC)

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

Nota

È ora possibile aggiungere record in blocco in modo più efficiente. Per altre informazioni, vedere Recordset: Aggiunta di record in blocco (ODBC).For more information, see Recordset: Adding Records in Bulk (ODBC).

Nota

Questo argomento si applica agli oggetti derivati da CRecordset in cui non è stato implementato il recupero di massa di righe. Se si usa il recupero di righe bulk, vedere Recordset: recupero di record in blocco (ODBC).

Gli snapshot e i dynaset aggiornabili consentono di aggiungere, modificare (aggiornare) ed eliminare record. In questo argomento:

Per altre informazioni sul modo in cui vengono eseguiti gli aggiornamenti e su come vengono visualizzati gli aggiornamenti ad altri utenti, vedere Recordset: How Recordsets Update Records (ODBC). In genere, quando si aggiunge, modifica o si elimina un record, il recordset modifica immediatamente l'origine dati. È invece possibile raggruppare in batch gli aggiornamenti correlati nelle transazioni. Se una transazione è in corso, l'aggiornamento non diventa finale fino a quando non si esegue il commit della transazione. In questo modo è possibile ripristinare o eseguire il rollback delle modifiche. Per informazioni sulle transazioni, vedere Transaction (ODBC).

La tabella seguente riepiloga le opzioni disponibili per i recordset con caratteristiche di aggiornamento diverse.

Opzioni di lettura/aggiornamento recordset

Type Lettura Modifica record Elimina record Aggiungi nuovo (accodamento)
Sola lettura Y N N N
Solo accodamento Y N N Y
Completamente aggiornabile S Y Y S

Determinare se il recordset è aggiornabile

Un oggetto recordset è aggiornabile se l'origine dati è aggiornabile e l'oggetto recordset è stato aperto come aggiornabile. La sua aggiornabilità dipende anche dall'istruzione SQL usata, dalle funzionalità del driver ODBC e dal fatto che la libreria di cursori ODBC sia in memoria. Non è possibile aggiornare un recordset o un'origine dati di sola lettura.

Per determinare se il recordset è aggiornabile

  1. Chiamare la funzione membro CanUpdate dell'oggetto recordset.

    CanUpdate restituisce un valore diverso da zero se l'oggetto recordset è aggiornabile.

Per impostazione predefinita, i recordset sono completamente aggiornabili (è possibile eseguire AddNewoperazioni , Edite Delete ). Ma è anche possibile usare l'opzione appendOnly per aprire recordset aggiornabili. Un recordset aperto in questo modo consente solo l'aggiunta di nuovi record con AddNew. Non è possibile modificare o eliminare record esistenti. È possibile verificare se un recordset è aperto solo per l'aggiunta chiamando la funzione membro CanAppend . CanAppend restituisce un valore diverso da zero se il recordset è completamente aggiornabile o aperto solo per l'accodamento.

Il codice seguente illustra come usare CanUpdate per un oggetto recordset denominato rsStudentSet:

if( !rsStudentSet.Open( ) )
    return FALSE;
if( !rsStudentSet.CanUpdate( ) )
{
    AfxMessageBox( "Unable to update the Student recordset." );
    return;
}

Attenzione

Quando si prepara ad aggiornare un recordset chiamando Update, prestare attenzione che il recordset includa tutte le colonne che costituiscono la chiave primaria della tabella (o tutte le colonne di qualsiasi indice univoco nella tabella). In alcuni casi, il framework può usare solo le colonne selezionate nel recordset per identificare il record nella tabella da aggiornare. Senza tutte le colonne necessarie, più record potrebbero essere aggiornati nella tabella, eventualmente danneggiando l'integrità referenziale della tabella. In questo caso, il framework genera eccezioni quando si chiama Update.

Aggiunta di un record a un oggetto Recordset

È possibile aggiungere nuovi record a un recordset se la relativa funzione membro CanAppend restituisce un valore diverso da zero.

Per aggiungere un nuovo record a un recordset

  1. Assicurarsi che il recordset sia accodabile.

  2. Chiamare la funzione membro AddNew dell'oggetto recordset.

    AddNew prepara il recordset come buffer di modifica. Tutti i membri dati del campo vengono impostati sul valore speciale Null e contrassegnati come invariati, pertanto solo i valori modificati (dirty) vengono scritti nell'origine dati quando si chiama Update.

  3. Impostare i valori dei membri dati del campo del nuovo record.

    Assegnare valori ai membri dati del campo. Quelli non assegnati non vengono scritti nell'origine dati.

  4. Chiamare la funzione membro dell'oggetto Update recordset.

    Update completa l'aggiunta scrivendo il nuovo record nell'origine dati. Per informazioni su ciò che accade se non si riesce a chiamare Update, vedere Recordset: How Recordsets Update Records (ODBC).

Per informazioni sul funzionamento dell'aggiunta di record e su quando i record aggiunti sono visibili nel recordset, vedere Recordset: How AddNew, Edit, and Delete Work (ODBC).

Nell'esempio seguente viene illustrato come aggiungere un nuovo record:

if( !rsStudent.Open( ) )
    return FALSE;
if( !rsStudent.CanAppend( ) )
    return FALSE;                      // no field values were set
rsStudent.AddNew( );
rsStudent.m_strName = strName;
rsStudent.m_strCity = strCity;
rsStudent.m_strStreet = strStreet;
if( !rsStudent.Update( ) )
{
    AfxMessageBox( "Record not added; no field values were set." );
    return FALSE;
}

Suggerimento

Per annullare una chiamata o Edit , è sufficiente effettuare un'altra chiamata a AddNew o Edit chiamare Move con il parametro AFX_MOVE_REFRESH.AddNew I membri dati vengono reimpostati ai valori precedenti e si è ancora in Edit modalità o Add .

Modifica di un record in un oggetto Recordset

È possibile modificare i record esistenti se la funzione membro CanUpdate del recordset restituisce un valore diverso da zero.

Per modificare un record esistente in un recordset

  1. Assicurarsi che il recordset sia aggiornabile.

  2. Scorrere fino al record da aggiornare.

  3. Chiamare la funzione membro Edit dell'oggetto recordset.

    Edit prepara il recordset come buffer di modifica. Tutti i membri dati del campo sono contrassegnati in modo che il recordset possa indicare in un secondo momento se sono stati modificati. I nuovi valori per i membri dati dei campi modificati vengono scritti nell'origine dati quando si chiama Update.

  4. Impostare i valori dei membri dati del campo del nuovo record.

    Assegnare valori ai membri dati del campo. Quelli che non si assegnano valori rimangono invariati.

  5. Chiamare la funzione membro dell'oggetto Update recordset.

    Update completa la modifica scrivendo il record modificato nell'origine dati. Per informazioni su ciò che accade se non si riesce a chiamare Update, vedere Recordset: How Recordsets Update Records (ODBC).

Dopo aver modificato un record, il record modificato rimane il record corrente.

Nell'esempio seguente viene illustrata un'operazione Edit . Presuppone che l'utente abbia spostato in un record che vuole modificare.

rsStudent.Edit( );
rsStudent.m_strStreet = strNewStreet;
rsStudent.m_strCity = strNewCity;
rsStudent.m_strState = strNewState;
rsStudent.m_strPostalCode = strNewPostalCode;
if( !rsStudent.Update( ) )
{
    AfxMessageBox( "Record not updated; no field values were set." );
    return FALSE;
}

Suggerimento

Per annullare una chiamata o Edit , è sufficiente effettuare un'altra chiamata a AddNew o Edit chiamare Move con il parametro AFX_MOVE_REFRESH.AddNew I membri dati vengono reimpostati ai valori precedenti e si è ancora in Edit modalità o Add .

Eliminazione di un record da un recordset

È possibile eliminare i record se la funzione membro CanUpdate del recordset restituisce un valore diverso da zero.

Per eliminare un record

  1. Assicurarsi che il recordset sia aggiornabile.

  2. Scorrere fino al record da aggiornare.

  3. Chiamare la funzione membro Delete dell'oggetto recordset.

    Delete contrassegna immediatamente il record come eliminato, sia nel recordset che nell'origine dati.

    A differenza di AddNew e Edit, Delete non ha alcuna chiamata corrispondente Update .

  4. Scorrere fino a un altro record.

    Nota

    Quando si passa attraverso il recordset, i record eliminati potrebbero non essere ignorati. Per altre informazioni, vedere la funzione membro IsDeleted .

Nell'esempio seguente viene illustrata un'operazione Delete . Si presuppone che l'utente abbia spostato in un record che l'utente vuole eliminare. Dopo Delete la chiamata, è importante passare a un nuovo record.

rsStudent.Delete( );
rsStudent.MoveNext( );

Per altre informazioni sugli effetti delle AddNewfunzioni membro , Edite Delete , vedere Recordset: How Recordsets Update Records (ODBC).

Vedi anche

Recordset (ODBC)
Recordset: blocco dei record (ODBC)