TN053: routine DFX personalizzate per le classi 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 ciò che avviene nelle routine di DFX, la funzione di DFX_Text verrà illustrata in dettaglio come esempio. Come fonte di informazioni aggiuntive alla nota tecnica, è possibile esaminare il codice per l'altro le funzioni di l DFX. Probabilmente non spesso sono necessari di una routine personalizzata DFX come potrebbe essere necessaria una routine personalizzata RFX (utilizzata con le classi di database ODBC).
Questa nota tecnica contiene:
Cenni preliminari su DFX
Esempi utilizzando il trasferimento di campi di record DAO e del 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 è semplificato utilizzando i 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 mediante 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 utilizzare un ibrido statico e il collegamento dinamico possono essere utilizzati.
Esempio 1 - utilizzo di trasferimento di campi di record DAO solo
(presuppone che CDaoRecordset - classe derivata 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, rs ed è 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 DAO e del collegamento dinamico
(presuppone che i dati con CDaoRecordset- classe derivata emp employee 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 di trasferimento di campi di Record 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 è solo alcune operazioni.
Anche DFX crea la clausola SQL SELEZIONA e la clausola SQL PARAMETRI se necessario.
Anche DFX costruire 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 le matrici dello stato di MODIFICA e di NULL e di set se necessario per gli aggiornamenti.
Al centro del meccanismo di DFX è la funzione di DoFieldExchange della classe derivata di CDaoRecordset. Questa funzione invia le chiamate alle funzioni di l DFX di un tipo appropriato di un'operazione. Prima di chiamare DoFieldExchange le funzioni MFC interne impostare il tipo di operazione. Di seguito sono elencati i diversi tipi di un'operazione e una breve descrizione.
Operazione |
Descrizione |
---|---|
AddToParameterList |
Clausola di PARAMETRI di compilazioni |
AddToSelectList |
Le compilazioni la clausola SELECT |
BindField |
Configura la struttura di associazione |
BindParam |
Imposta i valori dei parametri |
Correzioni |
Imposta ANNULLANO lo stato |
AllocCache |
Alloca la cache per il controllo modificato |
StoreField |
Salva il record corrente per memorizzare nella cache |
LoadField |
I ripristina memorizzazione nella cache ai valori di membro |
FreeCache |
Libera la cache |
SetFieldNull |
Valore dello stato & dei campi di insiemi SU NULL |
MarkForAddNew |
Contrassegnare NULL modifica dei campi se non di PSEUDO |
MarkForEdit |
Contrassegna i campi modificati se non corrisponde alla cache |
SetDirtyField |
Imposta i valori dei campi contrassegnati come modificati |
Nella sezione successiva, ogni operazione verrà illustrato in maggiore dettaglio per DFX_Text.
La funzionalità più importante comprendere sul processo di trasferimento di campi di record DAO è di utilizzare 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 è compreso nell'ambito di questa nota tecnica.
DAO GetRows può essere eseguita in diversi modi.
Può recuperare più record e i più campi di dati contemporaneamente. È pertanto possibile per l'accesso ai dati più veloce con una complicazione gestire grande struttura di dati e di offset appropriati per ogni campo e for ogni record di dati nella struttura. MFC non sfrutta di questo meccanismo di recupero di più record.
Un'altra modalità GetRows può funzionare prevede che i programmatori di specificare gli indirizzi di associazione dei dati recuperati da ogni campo per un record di dati.
DAO anche "chiamerà indietro in" chiamante per le colonne di lunghezza variabile per consentire al chiamante di allocare memoria. Questa seconda che funzionalità presenta il vantaggio di ridurre il numero di copie dei dati nonché di consentire l'archiviazione diretta dei dati dei membri di classe (la classe derivata di CDaoRecordset ). Questo secondo consiste il metodo utilizzato da 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 dei dati necessari correttamente per chiamare GetRows. Esistono numerosi altre operazioni che una funzione di DFX deve supportare anche, ma nessuno importanti o complesso quanto correttamente preparare la chiamata di GetRows.
L'utilizzo di DFX è 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 ai dati del campo nel database o almeno essere convertibile nel tipo. Ad esempio un campo numerico nel database, ad esempio un integer long, è possibile convertirlo sempre al testo a e limitare 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 lunghi a un membro Integer long. DAO e Il modulo di gestione di database Microsoft Jet sono responsabili della conversione (anziché MFC).
Dettagli di DFX_Text
Come accennato in precedenza, il modo migliore per illustrare il funzionamento di DFX venga eseguita con un esempio. A questo scopo passare attraverso i internals di DFX_Text deve 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. Ciascun parametro è denominato e tipizzato (come specificato nella chiamata a RFX). Vedere funzione di CDaoFieldExchange::AppendParamType di funzione per visualizzare i nomi di diversi tipi. Nel caso di DFX_Text, il tipo utilizzato text.AddToSelectList
Compilare la clausola SQL SELEZIONA. Ciò è abbastanza semplice poiché la colonna nome specificato dalla chiamata di DFX viene aggiunto semplicemente ("SELECT <column name>, ...").BindField
Il più complesso di operazioni. Come accennato in precedenza in cui la struttura dell'associazione di DAO utilizzata da GetRows viene installata. 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 è installato anche. In una sezione precedente GetRows è stato illustrato solo brevemente, ma è sufficiente spiegare che il tipo di associazione utilizzato da MFC è sempre associazione a indirizzo diretto (DAOBINDING_DIRECT). Sempre per l'associazione di callback di lunghezza variabile dell'associazione di colonna (come DFX_Text) viene utilizzato in modo da poter controllare l'allocazione della memoria e specificare MFC un indirizzo della lunghezza corretta. Cosa questi che è possibile eseguire tale MFC può stabilire sempre DAO "dove" inserire dati, consentendo pertanto a associare direttamente a variabili membro. Il resto della struttura di associazione è compilato con informazioni quali l'indirizzo della funzione di callback dell'allocazione di memoria e del tipo di associazione di colonna (che derivano 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
Compilare lo stato di NULL per ogni campo.SetFieldNull
Questa operazione contrassegna solo in ogni stato di campo come NULL e impostare il valore di una variabile membro a PSEUDO_NULL.SetDirtyField
Chiama SetFieldValue per ogni campo contrassegnato come modificato.
Tutte le operazioni rimanenti si tratta 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 campo. L'implementazione del buffering utilizza una mappa. Questa mappa viene utilizzata per la corrispondenza sulle copie allocate in modo dinamico dei dati con l'indirizzo del campo "associato" (o il membro dati derivato di CDaoRecordset ).
AllocCache
Alloca dinamicamente il valore del campo memorizzato nella cache e lo aggiunge alla mappa.FreeCache
Elimina il valore del campo memorizzato nella cache e la 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 non èNULL e contrassegnarlo modificato se necessario.MarkForEdit
Confronta il valore del campo corrente con la cache di dati e contrassegna modificato se necessario.
Suggerimento
Modelli delle routine personalizzate DFX sulle routine esistenti di DFX per i tipi di dati standard.