TN053: Routine personalizzate di DFX per le classi di database DAO
[!NOTA]
A partire da Visual C++ .NET, l'ambiente e le procedure guidate di Visual C++ non supportano più DAO, anche se le classi DAO sono incluse e possono essere comunque utilizzate.Si consiglia di utilizzare Modelli OLE DB o ODBC e MFC per i nuovi progetti.di utilizzare DAO solo per la gestione delle applicazioni già esistenti.
Questa nota tecnica viene descritto il meccanismo di trasferimento di campi di record DAO (DFX).Per comprendere cosa sta verificando nelle routine di DFX, la funzione di DFX_Text verrà illustrata in dettaglio come esempio.Come fonte di informazioni aggiuntive a questa nota tecnica, è possibile esaminare il codice per l'altro le funzioni utente DFX.Probabilmente non sarà necessario spesso di una routine personalizzate DFX come potrebbe essere necessaria una routine personalizzate RFX (utilizzata con le classi di database ODBC).
Questa nota tecnica contiene:
Cenni preliminari su DFX
esempi utilizzando il trasferimento di campi di record e DAO di collegamento dinamico
Come DFX Works
Ciò che la routine personalizzate DFX fa
Dettagli di DFX_Text
Cenni preliminari su DFX
Il meccanismo di trasferimento di campi di record DAO (DFX) viene utilizzata per semplificare la procedura di recuperare e aggiornare i dati quando si utilizza la classe di CDaoRecordset .Il processo viene semplificato l'utilizzo dei membri dati della classe di CDaoRecordset .Derivazione da CDaoRecordset, è possibile aggiungere i membri dati alla classe derivata che rappresenta ogni campo in una tabella o una query.Questo “meccanismo di associazione statica„ è semplice, ma non può essere il metodo di raccolta/aggiornamento dei dati di scelta per tutte le applicazioni.Anche DFX recupera tutti i campi associati ogni volta che il record corrente viene modificato.Se si sviluppa un'applicazione prestazioni-riservata che non richiede recuperare ogni campo quando la valuta viene modificata, il collegamento dinamico„ tramite CDaoRecordset::GetFieldValue e CDaoRecordset::SetFieldValue possono essere il metodo di accesso ai dati di scelta.
[!NOTA]
Anche DFX e il collegamento dinamico non si escludono a vicenda, in modo da un utilizzo ibrido statico e il collegamento dinamico possono essere utilizzati.
Esempio 1 — utilizzo di trasferimento di campi di record DAO solo
(presuppone che CDaoRecordset nella classe derivata da CMySet già aperto)
// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();
Esempio 2 — utilizzo di collegamento dinamico solo
(si presuppone l'utilizzo della classe di CDaoRecordset , rsed è già aperta)
// Add a new record to the customers table
COleVariant varFieldValue1 ( _T("MSFT"), VT_BSTRT );
//Note: VT_BSTRT flags string type as ANSI, instead of UNICODE default
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 trasferimento di campi di record e DAO di collegamento dinamico
(presuppone che i dati con CDaoRecordsetnella classe derivata da empemployee di esplorazione)
// Get the employee's data so that it can be displayed
emp.MoveNext();
// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
emp.GetFieldValue(_T("photo"), varPhoto);
// Display the data
PopUpEmployeeData(emp.m_strFirstName,
emp.m_strLastName, varPhoto);
Come DFX Works
Il meccanismo di DFX funziona in modo simile al meccanismo RFX (Record Field Exchange) utilizzato dalle classi ODBC MFC.I principi di DFX e RFX sono uguali ma esistono numerose differenze interne.La progettazione delle funzioni di DFX è tale che praticamente qualsiasi codice è condiviso dalle routine dell'utente DFX.DFX al livello più elevato dispone di alcune operazioni.
Anche DFX crea la clausola SQL SELEZIONA e la clausola SQL PARAMETRI se necessario.
Anche DFX crea la struttura di associazione utilizzata dalla funzione di GetRows di DAO (ulteriori informazioni su questo versioni successive).
Anche DFX gestisce il buffer di dati utilizzato per rilevare i campi modificati (se il doppio buffering utilizza)
Anche DFX gestisce matrici dello stato di DIRTY e di NULL e valori di set se necessario per gli aggiornamenti.
Il centro del meccanismo di DFX è la funzione di DoFieldExchange della classe derivata CDaoRecordset .Questa funzione invia le chiamate alle funzioni utente DFX di un tipo appropriato dell'operazione.Prima di chiamare DoFieldExchange le funzioni MFC interne impostare il tipo di operazione.Di seguito sono elencati i diversi tipi dell'operazione e una breve descrizione.
Operazione |
Descrizione |
---|---|
AddToParameterList |
Clausola di PARAMETRI di compilazione |
AddToSelectList |
Le compilazioni SELECT la clausola |
BindField |
Imposta la struttura di associazione |
BindParam |
Imposta i valori dei parametri |
Correzioni |
Imposta NULL lo stato |
AllocCache |
Alloca la cache per il controllo modificato |
StoreField |
Salva il record corrente per memorizzare nella cache |
LoadField |
I ripristina memorizzare nella cache ai valori di membro |
FreeCache |
Libera la cache |
SetFieldNull |
Lo stato & valore del campo di insiemi FROM NULL |
MarkForAddNew |
Contrassegni NULL modifica dei campi se non di PSEUDO |
MarkForEdit |
Contrassegna i campi modificati se non corrispondere alla cache |
SetDirtyField |
Imposta i valori dei campi contrassegnati come modificati |
Nella sezione successiva, ogni operazione viene illustrata in dettaglio per DFX_Text.
La funzionalità più importante comprendere sul processo di trasferimento di campi di record DAO è che utilizza la funzione di GetRows dell'oggetto di CDaoRecordset .La funzione di DAO GetRows può essere eseguita in diversi modi.Questa nota tecnica brevemente descriverà solo GetRows come non rientra nell'ambito di questa nota tecnica.
DAO GetRows può essere eseguita in diversi modi.
È possibile recuperare più record e più campi di dati contemporaneamente.Ciò consente di per l'accesso ai dati più veloce con una complicazione la gestione di grande struttura dei dati e di offset appropriati per ogni campo e for ogni record di dati nella struttura.MFC non usufruisce di questo meccanismo di recupero più record.
Un'altra modalità GetRows possibile eseguire consiste nel consentire ai programmatori di specificare gli indirizzi di associazione per i dati recuperati da ogni campo per un record di dati.
DAO anche “lo richiama„ nel chiamante per le colonne di lunghezza variabile per consentire al chiamante di allocare memoria.Questa seconda che funzionalità presenta il vantaggio di ridurre al minimo il numero di copie dei dati nonché di consentire l'archiviazione diretta dei dati nei membri di classe (la classe derivata di CDaoRecordset ).Questo secondo consiste metodo utilizza MFC associare ai membri dati nelle classi derivate di CDaoRecordset .
Ciò che la routine personalizzate DFX fa
Viene confermato da questa discussione che l'operazione più importante implementata in qualsiasi funzione di DFX deve essere la possibilità di impostare le strutture di dati obbligatorie correttamente per chiamare GetRows.Esistono diverse altre operazioni che una funzione di DFX deve supportare anche, ma nessuno importanti o complesso quanto correttamente preparazione per la chiamata di GetRows .
L'utilizzo di DFX viene descritto nella documentazione online.Essenzialmente, esistono due requisiti.Innanzitutto, i membri devono essere aggiunti alla classe derivata di CDaoRecordset per ogni campo associato e parametro.Attenendosi a questa CDaoRecordset::DoFieldExchange deve essere sottoposto a override.Si noti che il tipo di dati dei membri è importante.Deve corrispondere i dati del campo nel database o almeno essere convertibile in quel tipo.Ad esempio un campo numerico nel database, ad esempio un Integer lungo, è possibile convertire sempre su testo e associato a un membro di CString , ma un campo di testo in un database non è necessariamente essere convertito in una rappresentazione numerica, come integer e limite di lunghezza a un membro Integer lungo.DAO e Il modulo di gestione di database Microsoft Jet sono responsabili di conversione (anziché MFC).
Dettagli di DFX_Text
Come accennato in precedenza, il modo migliore per illustrare il funzionamento di DFX è di utilizzare un esempio.A questo scopo passare ai internals di DFX_Text necessario lavorare in modo per fornire almeno una conoscenza di base di DFX.
AddToParameterList
Questa operazione consente di compilare la clausola SQL PARAMETRI ("Parameters <param name>, <param type> ... ;") richiesta da jet.Ogni parametro è denominato e tipizzato (come specificato nella chiamata a RFX).Vedere funzione di CDaoFieldExchange::AppendParamType di funzione per visualizzare i nomi dei tipi.Nel caso di DFX_Text, il tipo utilizzato text.AddToSelectList
Compila la clausola SQL SELEZIONA .Ciò è abbastanza semplice come nome della colonna specificata nella chiamata di DFX viene aggiunto semplicemente ("SELECT <column name>, ...").BindField
Il più complesso di operazioni.Come accennato in precedenza questa posizione che la struttura dell'associazione di DAO utilizzata da GetRows viene configurato.Come si può notare dal codice in DFX_Text i tipi di informazioni nella struttura includono il tipo di DAO utilizzato (DAO_CHAR o DAO_WCHAR nel caso di DFX_Text).Inoltre, il tipo di associazione utilizzato anche impostazione.In una sezione precedente GetRows è stato illustrato solo un istante, ma è sufficiente spiegare che il tipo di associazione utilizzato da MFC è sempre associazione all'indirizzo diretto (DAOBINDING_DIRECT).Anche per l'associazione di callback di lunghezza variabile di associazione di colonna (ad esempio DFX_Text) viene utilizzato in modo da poter controllare l'allocazione della memoria e specificare MFC un indirizzo della lunghezza corretta.Ciò che tali il centro del MFC possibile impostare sempre DAO “dove„ inserire i dati, consentendo pertanto a associare direttamente alle variabili membro.Il resto della struttura di associazione viene riempito di elementi quali l'indirizzo della funzione di callback dell'allocazione di memoria e del tipo di associazione della colonna (associazione dal nome della colonna.BindParam
Si tratta di un'operazione semplice che chiama SetParamValue con il valore del parametro specificato nel membro di parametro.Fixup
Riempie lo stato di NULL per ogni campo.SetFieldNull
Questa operazione contrassegna solo ogni stato del campo come NULL e imposta il valore della variabile membro a PSEUDO_NULL.SetDirtyField
Chiama SetFieldValue per ogni stato contrassegnato il campo.
Tutte le operazioni rimanenti vengono gestiti solo dell'utilizzo della cache di dati.La cache di dati è un buffer aggiuntivo dei dati nel record corrente utilizzato per rendere determinate operazioni più semplici.Ad esempio, i campi “modifica„ possono essere automaticamente rilevati.Come descritto nella documentazione online possono essere disabilitate completamente o al set.L'implementazione del buffering utilizza un mapping.Questo mapping viene utilizzato per la corrispondenza sulle copie dinamicamente allocate dei dati con l'indirizzo del campo “associato„ (o il membro dati derivato di CDaoRecordset ).
AllocCache
Alloca dinamicamente il valore del campo memorizzati nella cache e lo aggiunge alla mappa.FreeCache
Elimina il valore del campo memorizzati nella cache e lo rimuove dalla mappa.StoreField
Copia il valore del campo corrente nella cache di dati.LoadField
Copia il valore memorizzato nella cache del membro del campo.MarkForAddNew
Controlla se il valore del campo corrente èNULL non e contrassegnarlo modificato se necessario.MarkForEdit
Confronta il valore del campo corrente con la cache di dati e contrassegna modificato se necessario.
Suggerimento |
---|
Modellare le routine personalizzate DFX sulle routine esistenti di DFX per i tipi di dati standard. |