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 AddNew
funzioni membro , Edit
e 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:Se non vengono rilevate modifiche,
Update
non esegue alcuna operazione e restituisce 0.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 );
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.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, chiamareSetFieldDirty
con un puntatore al campo e il parametro FALSE e non modificare il valore del campo. Per determinare se un campo può essere Null, chiamareIsFieldNullable
.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
SetFieldNull
anche , 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 Update
di , il recordset non deve essere vuoto e il record corrente non deve essere stato eliminato. IsBOF
, IsEOF
e 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:Se non sono state apportate modifiche,
Update
non esegue alcuna operazione e restituisce 0.In caso di modifiche,
Update
crea un'istruzione SQL UPDATE . Le colonne elencate nell'istruzione UPDATE sono basate sui membri dati del campo modificati.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.A differenza del processo per
AddNew
, ilEdit
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 chiamaUpdate
.Suggerimento
Se si chiama o
Edit
dopo aver chiamatoAddNew
una funzione in precedenza, ma prima di chiamareUpdate
, il buffer di modifica viene aggiornato con il record archiviato, sostituendo il record nuovo o modificato in corso. Questo comportamento consente di interrompere unAddNew
oggetto oEdit
e di avviarne uno nuovo: se si determina che il record in corso è difettoso, è sufficiente chiamareEdit
oAddNew
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 Delete
di , il recordset deve essere aggiornabile e deve trovarsi in un record. Le CanUpdate
funzioni membro , IsBOF
IsEOF
, 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:Il record corrente nel buffer di modifica non viene sottoposto a backup come in
AddNew
eEdit
.Delete
costruisce un'istruzione SQL DELETE che rimuove il record.Il record corrente nel buffer di modifica non viene archiviato come in
AddNew
eEdit
.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.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 chiamareEdit
.
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)