Questa nota tecnica viene descritto il meccanismo di scambio (DFX) campo record DAO. Per aiutare a capire cosa sta succedendo nelle routine di DFX, la funzione DFX_Text verrà spiegata in dettaglio come esempio. Come ulteriore fonte di informazioni per questa nota tecnica, si possono semplicemente esaminare il codice per l'altro le singole funzioni DFX.Lei probabilmente non sarà necessario una routine personalizzata DFX tutte le volte che si potrebbe aver bisogno di una routine personalizzata RFX (utilizzata con classi di database ODBC).
Questa nota tecnica contiene:
DFX Overview
Il meccanismo di scambio di campi di record DAO (DFX) viene utilizzato per semplificare la procedura di recupero e l'aggiornamento dei dati quando si utilizza la classe CDaoRecordset . Il processo è semplificato attraverso l'uso di membri dati della classe CDaoRecordset . Derivandolo da CDaoRecordset, è possibile aggiungere membri dati alla classe derivata che rappresenta ogni campo di una tabella o query. Questo meccanismo di "associazione statica" è semplice, ma non può essere il metodo di recupero/aggiornamento dei dati di scelta per tutte le applicazioni. DFX recupera ogni campo associato ogni volta che il record corrente viene modificato. Se si sviluppa un'applicazione sensibili alle prestazioni che non richiede il recupero ogni campo quando valuta viene modificato, "associazione dinamica" via CDaoRecordset::GetFieldValue e CDaoRecordset::SetFieldValue possono essere i dati di accesso metodo di scelta.
&Notanbsp; DFX e associazione dinamica non sono mutuamente esclusivi, in modo che un uso ibrido di associazione statica e dinamica può essere utilizzato.
Esempio 1 - utilizzo del campo Exchange DAO Record solo
(si presume CDaoRecordset - classe derivata CMySet già aperto)
/ / Aggiungi un nuovo record alla tabella customers
MySet.AddNew();
MySet.m_strCustID = _T("MSFT");
MySet.m_strCustName = _T("Microsoft");
MySet.Update)
Esempio 2 - uso della sola associazione dinamica
(si presume utilizzando la classe CDaoRecordset , rs , ed è già aperta)
/ / Aggiungi un nuovo record alla tabella customers
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / &Note: VT_BSTRT bandiere di tipo stringa come ANSI, anziché predefinita UNICODE
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
RS.AddNew();
RS.SetFieldValue(_T("Customer_ID"), varFieldValue1);
RS.SetFieldValue(_T("Customer_Name"), varFieldValue2);
RS.Update)
Esempio 3 - utilizzo di DAO Record campo Exchange e l'associazione dinamica
(si presuppone che i dati di navigazione dei dipendenti con CDaoRecordset-classe derivata emp )
/ / Ottenere dati del dipendente, affinché possa essere visualizzato
EMP.MoveNext ();
/ / Se l'utente desidera vedere fotografia del dipendente,
/ / recuperare lo
COleVariant varPhoto;
Se (bSeePicture)
EMP.GetFieldValue(_T("photo"), varPhoto);
/ / Display the data
PopUpEmployeeData (emp.m_strFirstName,
EMP.m_strLastName, varPhoto)
Il meccanismo DFX funziona in modo simile al meccanismo di scambio (RFX) del campo record utilizzato dalle classi ODBC MFC. Principi di DFX e RFX sono gli stessi, ma ci sono numerose differenze interne. Il design delle funzioni DFX era tale che praticamente tutto il codice è condivisa dalle routine dello DFX individuali. Al più alto livello DFX solo non poche cose.
Nel cuore del DFX meccanismo è funzione DoFieldExchange della classe CDaoRecordset derivato. Questa funzione invia chiamate alle funzioni DFX individuale di un tipo di operazione appropriata. Prima di chiamare DoFieldExchange MFC interno funzioni di impostare il tipo di operazione. La seguente lista mostra i vari tipi di operazione e una breve descrizione.
| Operazione | Descrizione |
| AddToParameterList | Costruisce la clausola di parametri |
| AddToSelectList | Clausola SELECT compilazioni |
| BindField | Consente di configurare la struttura di associazione |
| BindParam | Imposta i valori dei parametri |
| Fixup | Imposta lo stato NULL |
| AllocCache | Alloca la cache di controllo sporco |
| StoreField | Salva record corrente alla cache |
| LoadField | Ripristini nella cache i valori dei membri |
| FreeCache | Libera della cache |
| SetFieldNull | Mod&a di campo amp dello stato; valore su NULL |
| MarkForAddNew | Segna i campi sporchi se non NULL PSEUDO |
| MarkForEdit | Se sporca di marchi campi non corrispondono della cache |
| SetDirtyField | Imposta i valori contrassegnati come sporchi di campo |
Nella prossima sezione, ogni operazione verrà spiegato più in dettaglio per DFX_Text.
La caratteristica più importante per capire circa il processo di scambio di campi di record DAO è che usa la funzione di GetRows dell'oggetto ICDaoRecordset . La funzione DAO GetRows può lavorare in diversi modi. Questa nota tecnica solo brevemente descrivere GetRows come è di fuori della portata di questa nota tecnica.
DAO GetRows può lavorare in vari modi.
Che cosa fa la vostra Routine DFX Custom
Emerge da questa discussione che l'operazione più importante implementata in qualsiasi funzione DFX deve essere la capacità di istituire le strutture di dati richiesti per chiamare con successo GetRows. Ci sono un certo numero di altre operazioni che una funzione DFX deve supportare pure, ma nessuno come importante né complesso come prepararsi correttamente il GetRows chiamare.
L'uso di DFX è descritto nella documentazione in linea. In sostanza, ci sono 2 requisiti. In primo luogo, i membri devono essere aggiunti alla classe CDaoRecordset derivato per ogni campo associato e il parametro. Seguendo questa CDaoRecordset::DoFieldExchange dovrebbe essere sottoposto a override. Si noti che il tipo di dati del membro è importante. Dovrebbe corrispondere i dati dal campo del database o almeno essere convertibili in tale tipo. Ad esempio un campo numerico nel database, ad esempio un intero long, sempre può essere convertito in testo e associato a un membro di CString , ma un campo di testo in un database non necessariamente può essere convertito in una rappresentazione numerica, come ad esempio un intero lungo e associato a un membro di un long integer. DAO e la gestione di database Microsoft Jet sono responsabili per la conversione (piuttosto che MFC).
Come accennato in precedenza, probabilmente il modo migliore per spiegare come funziona DFX è semplicemente lavorare attraverso un esempio. A questo scopo attraverso elementi interni di DFX_Text dovrebbe funzionare abbastanza bene per contribuire a fornire almeno una conoscenza di base di DFX.
AddToParameterList
Questa operazione si basa la clausola SQL parametri (" Parameters lt;param name>, <param type> ... ; ") richiesto dal Jet. Ogni parametro è denominato e tipizzato (come specificato nella chiamata RFX). Vedere la funzione CDaoFieldExchange::AppendParamType funzione per visualizzare i nomi dei singoli tipi. Nel caso di DFX_Text, è il tipo utilizzatotext.
AddToSelectList
Costruisce la clausola SQL selezionare . Questo è abbastanza dritto in avanti come il nome di colonna specificato dalla chiamata DFX è semplicemente allegato (" SELECT lt;column name>, ... ").
BindField
-Di gran lunga il più complesso delle operazioni. Come accennato in precedenza che questo è dove si trova la struttura di associazione DAO utilizzata da GetRows . Come potete vedere dal codice in DFX_Text i tipi di informazioni nella struttura includono il tipo DAO utilizzato (DAO_CHAR o DAO_WCHAR in caso di DFX_Text). Inoltre, il tipo di associazione utilizzata è inoltre impostare. In un precedente sezione GetRows è stato descritto solo per breve tempo, ma è stato sufficiente a spiegare che il tipo di associazione utilizzata da MFC è sempre diretto indirizzo associazione (DAOBINDING_DIRECT). Inoltre per l'associazione di colonna di lunghezza variabile (come DFX_Text) richiamata viene utilizzata l'associazione affinché MFC può controllare l'allocazione di memoria e specificare un indirizzo di lunghezza corretta. Ciò significa che MFC può sempre dire DAO "dove" mettere i dati, consentendo così l'associazione direttamente alle variabili membro. Il resto della struttura di associazione viene riempito dalle cose come l'indirizzo della funzione di callback di allocazione di memoria e il tipo di colonna associazione (vincolante con il nome di colonna).
BindParam
Questa è una semplice operazione che chiama SetParamValue con il valore del parametro specificato nel vostro membro di parametro.
Fixup
Riempie lo stato NULL per ogni campo.
SetFieldNull
Questa operazione solo segna ogni lo stato del campo come NULL e imposta il membro valore della variabile PSEUDO_NULL.
SetDirtyField
Chiamate SetFieldValue per ogni campo contrassegnato sporco.
Tutte le operazioni rimanenti trattare solo con l'utilizzo della cache dei dati. La cache di dati è un buffer supplementare dei dati del record corrente che è usato per fare certe cose più semplici. Per esempio "sporchi" campi possono essere automaticamente rilevate. Come descritto nella documentazione in linea che può essere spento completamente o a livello di campo. L'implementazione del buffer utilizza una mappa. Questa mappa è usata per abbinare allocate dinamicamente copie dei dati con l'indirizzo del campo "vincolato" (o CDaoRecordset derieved membro dati).
AllocCache
Assegna il valore del campo nella cache in modo dinamico e lo aggiunge alla mappa.
FreeCache
Elimina il valore del campo nella cache e lo rimuove dalla mappa.
StoreField
Il valore corrente del campo viene copiato nella cache di dati.
LoadField
Copia il valore memorizzato nella cache nel membro di campo.
MarkForAddNew
Verifica se il valore del campo corrente è non-NULL e segna lo sporco se necessario.
MarkForEdit
Confronta il valore corrente del campo con cache di dati e segna sporco se necessario.
Suggerime&ntonbsp; Modellare le routine DFX personalizzate le routine DFX esistenti per i tipi di dati standard.
&Note tecniche per numero |nbsp; Note tecniche per la categoria