TN043: RFX Routines

Questa nota viene descritta l'architettura di exchange (RFX) di campi di record. Viene inoltre descritto come si scrive una procedura RFX_.

Panoramica dei Record campo Exchange

Tutte le funzioni di campo del recordset vengono effettuate con codice C++. Ci sono risorse speciali o macro magiche. Il cuore del meccanismo è una funzione virtuale che deve essere sottoposto a override in ogni classe derivata recordset. Si trova sempre in questa forma:

public static void CMySet::DoFieldExchange (CFieldExchange pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  lt; recordset cambio campo tipo chiamata >
  < recordset scambio chiamata di funzione >
  //}}AFX_FIELD_MAP
}

I commenti AFX formato speciale permettono ClassWizard individuare e modificare il codice all'interno della funzione. Codice che non è compatibile con ClassWizard deve essere posizionato di fuori dei commenti formato speciale.

Nell'esempio sopra, lt; recordset_exchange_field_type_call > è in forma:

pFX->SetFieldType(CFieldExchange::outputColumn)

e lt; recordset_exchange_function_call > è in forma:

RFX_Custom (pFX, "Col2", m_Col2)

La maggior parte delle funzioni RFX_ hanno tre argomenti, come mostrato in precedenza, ma alcuni (ad esempio RFX_Text e RFX_Binary) hanno argomenti opzionali aggiuntivi.

Più di una RFX_ possono essere inclusi in ogni funzione DoDataExchange.

Vedere 'AFXDB' per un elenco di tutti i recordset campo scambio routines fornito con MFC.

Chiamate di campo del recordset sono un modo di registrazione di locazioni di memoria (di solito i membri dati) per memorizzare i dati di campo per una classe CMySet.

Note

Funzioni di campo del recordset sono progettate per funzionare solo con le classi di CRecordset . Essi non sono generalmente utilizzabili da altre classi MFC.

I valori iniziali dei dati vengono impostati nel costruttore C++ standard, di solito in un blocco con //{{AFX_FIELD_INIT(CMylSet) e //}}AFX_FIELD_INIT commenti.

Ogni funzione RFX_ deve supportare varie operazioni, che vanno dal ritorno lo status sporco del campo per l'archiviazione di campo in preparazione per la modifica del campo.

Ogni funzione che chiama DoFieldExchange (per esempio SetFieldNull, IsFieldDirty), fa il proprio inizializzazione attorno alla chiamata a DoFieldExchange.

Come funziona?

Non è necessario comprendere i seguenti per poter utilizzare i campi di record di scambio. Tuttavia, la comprensione di come funziona dietro le quinte vi aiuterà scrivere propria procedura di scambio.

La funzione membro DoFieldExchange è molto simile la funzione membro Serialize - è responsabile per ottenere o impostare i dati a/da/per dati dei membri della classe da una forma esterna (in questo caso colonne dal risultato di una query ODBC). Il parametro pFX è in questo contesto per fare lo scambio di dati ed è simile al parametro CArchive per CObject::Serialize. PFX (un oggetto CFieldExchange ) dispone di un indicatore di operazione, che è simile, ma una generalizzazione della direzione CArchive bandiera. Una funzione RFX potrebbe essere necessario supportano le seguenti operazioni

Estensioni utente

Ci sono diversi modi per estendere il meccanismo predefinito di RFX. Si può

&Notanbsp;  Tale codice non può essere modificati da ClassWizard e deve essere usato solo di fuori dei commenti formato speciale.

Scrivendo una consuetudine RFX

Per scrivere la propria funzione RFX Custom, si suggerisce di copiare una funzione RFX esistente e modificarlo per i propri scopi. La destra RFX per copiare la selezione può rendere il vostro lavoro più facile. Alcune funzioni RFX hanno alcune proprietà uniche che dovrebbe tener conto al momento di decidere quale copiare.

RFX_Long e RFX_Int:

Queste sono le più semplici funzioni RFX. Il valore dei dati non ha bisogno di qualsiasi interpretazione speciali e la dimensione dei dati è fissata.

RFX_Single e RFX_Double:

Come RFX_Long e RFX_Int sopra, queste funzioni sono semplici e possono fare uso dell'implementazione predefinita estensivamente. Essi sono conservati nel dbflt.cpp invece di dbrfx.cpp, tuttavia, per consentire il caricamento di Common Language runtime galleggianti libreria punto soltanto quando sono in modo esplicito riferimento.

RFX_Text e RFX_Binary:

Queste due funzioni preallocare un buffer statico per contenere informazioni di stringa/binario e deve registrare tali buffer con ODBC SQLBindCol invece di registrarsi amp; valore. &A causa di ciò, queste due funzioni hanno un sacco di codice speciale.

RFX_Date:

ODBC restituisce informazioni di data e ora nella propria struttura di dati TIMESTAMP_STRUCT. Questa funzione alloca dinamicamente un TIMESTAMP_STRUCT come un "proxy" per l'invio e la ricezione dati time data. Varie operazioni è necessario trasferire le informazioni di data e ora tra l'oggetto C++ CTime e il proxy TIMESTAMP_STRUCT. Inutile dirlo, questo complica notevolmente questa funzione, ma è un buon esempio di come utilizzare un proxy per il trasferimento dati.

RFX_LongBinary:

Questa è la libreria di classi unica funzione RFX che non utilizzano la colonna associazione per ricevere e inviare i dati. Questa funzione ignora l'operazione di BindFieldToColumn e invece, durante l'operazione di correzione, alloca la memoria per contenere i dati in ingresso, SQL_LONGVARCHAR o SQL_LONGVARBINARY, quindi esegue una chiamata SQLGetData per recuperare il valore nella memoria allocata. Quando si prepara a inviare i valori dei dati all'origine dati (cioè operazioni NameValue e valore), questa funzione utilizza la funzionalità DATA_AT_EXEC di ODBC. Per ulteriori informazioni su come lavorare con SQL_LONGVARBINARY e SQL_LONGVARCHARs, vedere tecnica nota 45.

Quando si scrive una funzione di RFX_ , spesso sarà in grado di utilizzare CFieldExchange::Default per implementare una determinata operazione. Guardate l'implementazione di Default per l'operazione in questione. Se esegue l'operazione sarebbe essere iscritto nella funzione RFX_ è possibile delegare alla CFieldExchange::Default. Si possono vedere esempi di chiamate CFieldExchange::Default in dbrfx.cpp

È importante chiamare IsFieldType all'inizio della vostra funzione RFX e restituire immediatamente se restituisce FALSE. Questo meccanismo mantiene operazioni di parametro viene eseguito su outputColumnse viceversa (come una chiamata a BindParam su un outputColumn). Inoltre, IsFieldType automaticamente tiene traccia del conte di outputColumns (m_nFields) e params (m_nParams).

&Note tecniche per numero |nbsp; Note tecniche per la categoria

Index