Condividi tramite


Recordset: funzionamento dei metodi AddNew, Edit e Delete (ODBC)

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

In questo argomento viene illustrato il modo in cui le AddNewfunzioni membro , Edite Delete del lavoro di classe CRecordset . Gli argomenti trattati includono:

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).

Come supplemento, è possibile leggere Scambio di campi di record: Funzionamento di RFX, che descrive il ruolo corrispondente di RFX nelle operazioni di aggiornamento.

Aggiunta di un record

L'aggiunta di un nuovo record a un recordset comporta la chiamata della funzione membro AddNew del recordset, l'impostazione dei valori dei membri dati del campo del nuovo record e la chiamata della funzione membro Update per scrivere il record nell'origine dati.

Come precondizione per chiamare AddNew, il recordset non deve essere stato aperto come di sola lettura. Le CanUpdate funzioni membro e CanAppend consentono di determinare queste condizioni.

Quando si chiama AddNew:

  • Il record nel buffer di modifica viene archiviato, pertanto il relativo contenuto può essere ripristinato se l'operazione viene annullata.

  • I membri dati del campo vengono contrassegnati in modo che sia possibile rilevare le modifiche in un secondo momento. I membri dati del campo sono contrassegnati anche come puliti (non modificati) e impostati su Null.

Dopo aver chiamato AddNew, il buffer di modifica rappresenta un nuovo record vuoto, pronto per essere compilato con i valori. A tale scopo, impostare manualmente i valori assegnandoli. Anziché specificare un valore di dati effettivo per un campo, è possibile chiamare SetFieldNull per specificare il valore Null.

Per eseguire il commit delle modifiche, chiamare Update. Quando si chiama Update per il nuovo record:

  • Se il driver ODBC supporta la ::SQLSetPos funzione API ODBC, MFC usa la funzione per aggiungere il record nell'origine dati. Con ::SQLSetPos, MFC può aggiungere un record in modo più efficiente perché non deve costruire ed elaborare un'istruzione SQL.

  • Se ::SQLSetPos non è possibile usare , MFC esegue le operazioni seguenti:

    1. Se non vengono rilevate modifiche, Update non esegue alcuna operazione e restituisce 0.

    2. In caso di modifiche, Update crea un'istruzione SQL INSERT . Le colonne rappresentate da tutti i membri dati di campo dirty sono elencate nell'istruzione INSERT . Per forzare l'inserimento di una colonna, chiamare la funzione membro SetFieldDirty :

      SetFieldDirty( &m_dataMember, TRUE );
      
    3. Update esegue il commit del nuovo record: l'istruzione INSERT viene eseguita e viene eseguito il commit del record nella tabella nell'origine dati (e nel recordset, se non in uno snapshot), a meno che non sia in corso una transazione.

    4. Il record archiviato viene ripristinato nel buffer di modifica. Record corrente prima della AddNew chiamata corrente, indipendentemente dal fatto che l'istruzione INSERT sia stata eseguita correttamente.

    Suggerimento

    Per il controllo completo di un nuovo record, adottare l'approccio seguente: impostare i valori di tutti i campi che avranno valori e quindi impostare in modo esplicito tutti i campi che rimarranno Null chiamando SetFieldNull con un puntatore al campo e il parametro TRUE (impostazione predefinita). Se si desidera assicurarsi che un campo non venga scritto nell'origine dati, chiamare SetFieldDirty con un puntatore al campo e il parametro FALSE e non modificare il valore del campo. Per determinare se un campo può essere Null, chiamare IsFieldNullable.

    Suggerimento

    Per rilevare quando i membri dati del recordset cambiano valore, MFC usa un valore PSEUDO_NULL appropriato per ogni tipo di dati che è possibile archiviare in un recordset. Se è necessario impostare in modo esplicito un campo sul valore PSEUDO_NULL e il campo è già contrassegnato come Null, è necessario chiamare SetFieldNullanche , passando l'indirizzo del campo nel primo parametro e FALSE nel secondo parametro.

Visibilità dei record aggiunti

Quando un record aggiunto è visibile al recordset? I record aggiunti vengono talvolta visualizzati e talvolta non sono visibili, a seconda di due elementi:

  • Ciò che il conducente è in grado di.

  • Quali vantaggi possono essere sfruttati dal framework.

Se il driver ODBC supporta la ::SQLSetPos funzione API ODBC, MFC usa la funzione per aggiungere record. Con ::SQLSetPos, i record aggiunti sono visibili a qualsiasi recordset MFC aggiornabile. Senza il supporto per la funzione, i record aggiunti non sono visibili ed è necessario chiamare Requery per visualizzarli. L'uso ::SQLSetPos di è anche più efficiente.

Modifica di un record esistente

La modifica di un record esistente in un recordset comporta lo scorrimento del record, la chiamata della funzione membro Edit del recordset, l'impostazione dei valori dei membri dei dati del campo del nuovo record e la chiamata della funzione membro Update per scrivere il record modificato nell'origine dati.

Come precondizione per chiamare Edit, il recordset deve essere aggiornabile e su un record. Le CanUpdate funzioni membro e IsDeleted consentono di determinare queste condizioni. Il record corrente non deve essere già stato eliminato e deve essere presente record nel recordset (sia IsBOF che IsEOF restituire 0).

Quando si chiama Edit, il record nel buffer di modifica (il record corrente) viene archiviato. I valori del record archiviato vengono usati in un secondo momento per rilevare se i campi sono stati modificati.

Dopo aver chiamato Edit, il buffer di modifica rappresenta ancora il record corrente, ma è ora pronto per accettare le modifiche ai membri dati del campo. Per modificare il record, impostare manualmente i valori di qualsiasi membro dati di campo che si desidera modificare. Anziché specificare un valore di dati effettivo per un campo, è possibile chiamare SetFieldNull per specificare il valore Null. Per eseguire il commit delle modifiche, chiamare Update.

Suggerimento

Per uscire dalla AddNew modalità o Edit , chiamare Move con il parametro AFX_MOVE_REFRESH.

Come precondizione per la chiamata Updatedi , il recordset non deve essere vuoto e il record corrente non deve essere stato eliminato. IsBOF, IsEOFe IsDeleted devono restituire tutti 0.

Quando si chiama Update per il record modificato:

  • Se il driver ODBC supporta la ::SQLSetPos funzione API ODBC, MFC usa la funzione per aggiornare il record nell'origine dati. Con ::SQLSetPos, il driver confronta il buffer di modifica con il record corrispondente nel server, aggiornando il record nel server se i due sono diversi. Con ::SQLSetPos, MFC può aggiornare un record in modo più efficiente perché non deve costruire ed elaborare un'istruzione SQL.

    o

  • Se ::SQLSetPos non è possibile usare , MFC esegue le operazioni seguenti:

    1. Se non sono state apportate modifiche, Update non esegue alcuna operazione e restituisce 0.

    2. In caso di modifiche, Update crea un'istruzione SQL UPDATE . Le colonne elencate nell'istruzione UPDATE sono basate sui membri dati del campo modificati.

    3. Update esegue il commit delle modifiche: esegue l'istruzione UPDATE e il record viene modificato nell'origine dati, ma non viene eseguito il commit se è in corso una transazione (vedere Transazione: esecuzione di una transazione in un oggetto Recordset (ODBC) per informazioni sull'impatto della transazione sull'aggiornamento. ODBC mantiene una copia del record, che cambia anche.

    4. A differenza del processo per AddNew, il Edit processo non ripristina il record archiviato. Il record modificato rimane sul posto come record corrente.

    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 o colonne sufficienti per identificare in modo univoco la riga). 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, nella tabella potrebbero essere aggiornati più record. In questo caso, il framework genera eccezioni quando si chiama Update.

    Suggerimento

    Se si chiama o Edit dopo aver chiamato AddNew una funzione in precedenza, ma prima di chiamare Update, il buffer di modifica viene aggiornato con il record archiviato, sostituendo il record nuovo o modificato in corso. Questo comportamento consente di interrompere un AddNew oggetto o Edit e di avviarne uno nuovo: se si determina che il record in corso è difettoso, è sufficiente chiamare Edit o AddNew di nuovo.

Eliminazione di un record

L'eliminazione di un record da un recordset comporta lo scorrimento al record e la chiamata della funzione membro Delete del recordset. A differenza di AddNew e Edit, Delete non richiede una chiamata corrispondente a Update.

Come precondizione per la chiamata Deletedi , il recordset deve essere aggiornabile e deve trovarsi in un record. Le CanUpdatefunzioni membro , IsBOFIsEOF, e IsDeleted consentono di determinare queste condizioni.

Quando si chiama Delete:

  • Se il driver ODBC supporta la ::SQLSetPos funzione API ODBC, MFC usa la funzione per eliminare il record nell'origine dati. L'uso ::SQLSetPos di è in genere più efficiente rispetto all'uso di SQL.

    o

  • Se ::SQLSetPos non è possibile usare , MFC esegue le operazioni seguenti:

    1. Il record corrente nel buffer di modifica non viene sottoposto a backup come in AddNew e Edit.

    2. Delete costruisce un'istruzione SQL DELETE che rimuove il record.

      Il record corrente nel buffer di modifica non viene archiviato come in AddNew e Edit.

    3. Delete esegue il commit dell'eliminazione: esegue l'istruzione DELETE . Il record viene contrassegnato come eliminato nell'origine dati e, se il record è uno snapshot, in ODBC.

    4. I valori del record eliminato sono ancora presenti nei membri dati del campo del recordset, ma i membri dati dei campi sono contrassegnati come Null e la funzione membro del IsDeleted recordset restituisce un valore diverso da zero.

    Nota

    Dopo l'eliminazione di un record, è necessario scorrere fino a un altro record per riempire il buffer di modifica con i dati del nuovo record. Si tratta di un errore di chiamare Delete di nuovo o di chiamare Edit.

Per informazioni sulle istruzioni SQL usate nelle operazioni di aggiornamento, vedere SQL.

Vedi anche

Recordset (ODBC)
Recordset: altre informazioni sugli aggiornamenti (ODBC)
Trasferimento di campi di record (RFX)