Trasferimento di campi di record: funzionamento di RFX

Questo argomento illustra il processo RFX. Questo è un argomento avanzato che illustra:

Nota

Questo argomento si applica alle classi derivate da CRecordset in cui non è stato implementato il recupero di massa di righe. Se si usa il recupero di massa di righe, viene implementato il trasferimento di massa di campi di record (RFX di massa). RFX di massa è simile a RFX. Per comprendere le differenze, vedere Recordset: recupero di record in blocco (ODBC).To understand the differences, see Recordset: Fetching Records in Bulk (ODBC).

RFX e Recordset

I membri dati del campo dell'oggetto recordset, combinati, costituiscono un buffer di modifica che contiene le colonne selezionate di un record. Quando il recordset viene aperto per la prima volta e sta per leggere il primo record, RFX associa (associa) ogni colonna selezionata all'indirizzo del membro dati del campo appropriato. Quando il recordset aggiorna un record, RFX chiama le funzioni API ODBC per inviare un'istruzione SQL UPDATE o INSERT al driver. RFX usa la conoscenza dei membri dei dati dei campi per specificare le colonne da scrivere.

Il framework esegue il backup del buffer di modifica in determinate fasi in modo che possa ripristinarne il contenuto, se necessario. RFX esegue il backup del buffer di modifica prima di aggiungere un nuovo record e prima di modificare un record esistente. Ripristina il buffer di modifica in alcuni casi, ad esempio, dopo una Update chiamata che segue AddNew. Il buffer di modifica non viene ripristinato se si abbandona un buffer di modifica appena modificato, ad esempio passando a un altro record prima di chiamare Update.

Oltre a scambiare dati tra l'origine dati e i membri dati del campo del recordset, RFX gestisce i parametri di associazione. Quando il recordset viene aperto, i membri dati dei parametri vengono associati nell'ordine dei segnaposto "?" nell'istruzione SQL che CRecordset::Open costruisce. Per altre informazioni, vedere Recordset: Parametrizzazione di un oggetto Recordset (ODBC).For more information, see Recordset: Parameterizing a Recordset (ODBC).

L'override della classe recordset di DoFieldExchange esegue tutte le operazioni, spostando i dati in entrambe le direzioni. Analogamente allo scambio di dati delle finestre di dialogo (DDX), RFX necessita di informazioni sui membri dati della classe. La procedura guidata fornisce le informazioni necessarie scrivendo automaticamente un'implementazione specifica del recordset di DoFieldExchange , in base ai nomi dei membri dati dei campi e ai tipi di dati specificati con la procedura guidata.

Processo di scambio di campi record

Questa sezione descrive la sequenza di eventi RFX come oggetto recordset aperto e durante l'aggiunta, l'aggiornamento e l'eliminazione dei record. La tabella Sequenza di operazioni RFX durante l'apertura del recordset e la tabella Sequenza di operazioni RFX durante lo scorrimento in questo argomento illustrano il processo mentre RFX elabora un Move comando nel recordset e poiché RFX gestisce un aggiornamento. Durante questi processi, DoFieldExchange viene chiamato per eseguire molte operazioni diverse. Il m_nOperation membro dati dell'oggetto CFieldExchange determina l'operazione richiesta. Potrebbe risultare utile leggere Recordset: How Recordsets Select Records (ODBC) and Recordset: How Recordsets Update Records (ODBC) before you read this material .

RFX: associazione iniziale di colonne e parametri

Le attività RFX seguenti si verificano, nell'ordine indicato, quando si chiama la funzione membro Open di un oggetto recordset:

  • Se il recordset dispone di membri dati dei parametri, il framework chiama DoFieldExchange per associare i parametri ai segnaposto dei parametri nella stringa di istruzione SQL del recordset. Viene usata una rappresentazione dipendente dal tipo di dati del valore del parametro per ogni segnaposto presente nell'istruzione SELECT . Ciò si verifica dopo la preparazione dell'istruzione SQL, ma prima dell'esecuzione. Per informazioni sulla preparazione delle istruzioni, vedere la ::SQLPrepare funzione nella guida di riferimento per programmatori ODBC.

  • Il framework chiama DoFieldExchange una seconda volta per associare i valori delle colonne selezionate ai membri dati del campo corrispondenti nel recordset. In questo modo l'oggetto recordset viene stabilito come buffer di modifica contenente le colonne del primo record.

  • Il recordset esegue l'istruzione SQL e l'origine dati seleziona il primo record. Le colonne del record vengono caricate nei membri dati del campo del recordset.

Nella tabella seguente viene illustrata la sequenza di operazioni RFX quando si apre un recordset.

Sequenza di operazioni RFX durante l'apertura del recordset

L'operazione Operazione DoFieldExchange Operazione database/SQL
1. Aprire recordset.
2. Compilare un'istruzione SQL.
3. Inviare sql.
4. Associare i membri dei dati dei parametri.
5. Associare i membri dei dati dei campi alle colonne.
6. ODBC esegue lo spostamento e inserisce i dati.
7. Correggere i dati per C++.

I recordset usano l'esecuzione preparata di ODBC per consentire la ripetizione rapida delle query con la stessa istruzione SQL. Per altre informazioni sull'esecuzione preparata, vedere le informazioni di riferimento sul programmatore ODBC.

RFX: scorrimento

Quando si scorre da un record a un altro, il framework chiama DoFieldExchange per sostituire i valori archiviati in precedenza nei membri dati del campo con valori per il nuovo record.

Nella tabella seguente viene illustrata la sequenza di operazioni RFX quando l'utente passa dal record al record.

Sequenza di operazioni RFX durante lo scorrimento

L'operazione Operazione DoFieldExchange Operazione database/SQL
1. Chiamare MoveNext o una delle altre funzioni Move.
2. ODBC esegue lo spostamento e inserisce i dati.
3. Correggere i dati per C++.

RFX: aggiunta di nuovi record e modifica di record esistenti

Se si aggiunge un nuovo record, il recordset opera come buffer di modifica per creare il contenuto del nuovo record. Come per l'aggiunta di record, la modifica dei record comporta la modifica dei valori dei membri dati del campo del recordset. Dal punto di vista RFX, la sequenza è la seguente:

  1. La chiamata alla funzione membro AddNew o Edit del recordset fa sì che RFX archivii il buffer di modifica corrente in modo che possa essere ripristinato in un secondo momento.

  2. AddNew o Edit prepara i campi nel buffer di modifica in modo che RFX possa rilevare i membri dati dei campi modificati.

    Poiché un nuovo record non ha valori precedenti da confrontare con quelli nuovi, AddNew imposta il valore di ogni membro dati del campo su un valore PSEUDO_NULL. Successivamente, quando si chiama Update, RFX confronta il valore di ogni membro dati con il valore PSEUDO_NULL. Se esiste una differenza, il membro dati è stato impostato. (PSEUDO_NULL non è uguale a una colonna di record con un valore Null true, né è uguale a C++ NULL.

    A differenza della Update chiamata a AddNew, la Update chiamata per Edit confronta i valori aggiornati con i valori archiviati in precedenza anziché usare PSEUDO_NULL. La differenza è che AddNew non ha valori archiviati in precedenza per il confronto.

  3. È possibile impostare direttamente i valori dei membri dati dei campi i cui valori si desidera modificare o che si desidera compilare per un nuovo record. Ciò può includere la chiamata a SetFieldNull.

  4. La chiamata a Aggiorna verifica la presenza di membri dati dei campi modificati, come descritto nel passaggio 2 (vedere la tabella Sequenza di operazioni RFX durante lo scorrimento). Se nessuno è stato modificato, Update restituisce 0. Se alcuni membri dati di campo sono stati modificati, Update prepara ed esegue un'istruzione SQL INSERT che contiene valori per tutti i campi aggiornati nel record.

  5. Per AddNew, Update conclude ripristinando i valori archiviati in precedenza del record corrente prima della AddNew chiamata. Per Edit, i nuovi valori modificati rimangono sul posto.

Nella tabella seguente viene illustrata la sequenza di operazioni RFX quando si aggiunge un nuovo record o si modifica un record esistente.

Sequenza di operazioni RFX durante AddNew e Edit

L'operazione Operazione DoFieldExchange Operazione database/SQL
1. Chiamare AddNew o Edit.
2. Eseguire il backup del buffer di modifica.
3. Per AddNew, contrassegnare i membri dei dati del campo come "clean" e Null.
4. Assegnare valori ai membri dati dei campi del recordset.
5. Chiamare Update.
6. Verificare la presenza di campi modificati.
7. Compilare l'istruzione SQL INSERT per o l'istruzione UPDATE per Edit.AddNew
8. Inviare il codice SQL.
9. Per AddNew, ripristinare il buffer di modifica nel contenuto di cui è stato eseguito il backup. Per Edit, eliminare il backup.

RFX: eliminazione di record esistenti

Quando si elimina un record, RFX imposta tutti i campi su NULL come promemoria che il record viene eliminato ed è necessario rimuoverlo. Non sono necessarie altre informazioni sulla sequenza RFX.

Vedi anche

Trasferimento di campi di record (RFX)
Consumer ODBC MFC
Macro, funzioni globali e variabili globali
Classe CFieldExchange
CRecordset::D oFieldExchange