Condividi tramite


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.

SuggerimentoSuggerimento

Modellare le routine personalizzate DFX sulle routine esistenti di DFX per i tipi di dati standard.

Vedere anche

Altre risorse

Note tecniche del numero

Note tecniche per categoria