Condividi tramite


TN043: Routine RFX

[!NOTA]

La seguente nota tecnica non è stata aggiornata dalla prima volta che viene inclusa nella documentazione online.Di conseguenza, alcune procedure e argomenti potrebbero non essere aggiornati o errati.Per le informazioni più recenti, è consigliabile cercare l'argomento di interesseindice della documentazione online.

Questa nota viene descritta l'architettura di trasferimento di campi di Record.Viene inoltre descritto come scrivere una routine di RFX_ .

Panoramica di trasferimento di campi di Record

Tutte le funzioni di campo del recordset vengono effettuate con il codice C++.Non esistono risorse speciali macro o magiche.Il fulcro del meccanismo è una funzione virtuale che è necessario eseguire l'override in ogni classe derivata del recordset.Si trova sempre nel seguente formato:

void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
  //{{AFX_FIELD_MAP(CMySet)
  <recordset exchange field type call>
  <recordset exchange function call>
  //}}AFX_FIELD_MAP
}

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

Nell'esempio precedente, <recordset_exchange_field_type_call> è il formato seguente:

pFX->SetFieldType(CFieldExchange::outputColumn);

e <recordset_exchange_function_call> è il formato seguente:

RFX_Custom(pFX, "Col2", m_Col2);

La maggior parte delle funzioni di RFX_ hanno tre argomenti come illustrato nell'esempio precedente, ma some (ad esempioRFX_Text e RFX_Binary) presentano argomenti aggiuntivi facoltativi.

Più di un RFX_ può essere incluso in ogni funzione di DoDataExchange .

Vedere “afxdb.h„ per un elenco di tutte le routine di scambio di campo del recordset disponibili in MFC.

Le chiamate di campo del recordset rappresentano un modo per registrare le posizioni di memoria (in genere membri dati) per archiviare i dati di campo per una classe di CMySet .

Note

Le funzioni di campo del recordset sono progettate per funzionare solo con le classi di CRecordset .Non sono generalmente utilizzati da altre classi MFC.

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

Ogni funzione di RFX_ deve supportare le varie operazioni, variant da restituire lo stato modificato il campo alla memorizzazione del campo in preparazione di modificare il campo.

Ogni funzione che chiama DoFieldExchange (ad esempio SetFieldNull, IsFieldDirty), gestisce la propria inizializzazione per racchiudere la chiamata a DoFieldExchange.

Funzionamento?

Non è necessario comprendere quanto segue per utilizzare trasferimento di campi di Record.Tuttavia, è importante poter questo funziona automaticamente possono consentire di scrivere una routine di scambio.

La funzione membro di DoFieldExchange è molto simile alla funzione membro di Serialize — è responsabile di ottenere o dell'impostazione dei dati a/da un form esterno (in questo caso colonne dal risultato di una query ODBC) da/verso i dati dei membri della classe.Il parametro di pFX è il contesto per eseguire lo scambio di dati ed è simile al parametro di CArchive a CObject::Serialize.pFX (un oggetto di CFieldExchange presenta un indicatore delle operazioni, che è simile a, ma una generalizzazione del flag della direzione di CArchive .Una funzione RFX essere necessario supportare le operazioni seguenti:

  • BindParam — indicare dove ODBC necessario recuperare i dati dei parametri

  • BindFieldToColumn — indicare dove ODBC necessario recuperare o di dati outputColumn del deposito

  • Fixup — lunghezze del set di CString/CByteArray , bit NULL dello stato di

  • MarkForAddNew — contrassegno modificato se il valore è cambiato poiché chiamata di AddNew

  • MarkForUpdate — contrassegno modificato se il valore è cambiato poiché chiamata di modifica

  • Nome — Aggiungere i nomi dei campi per i campi ha contrassegnato come modificato

  • NameValue — aggiungere “<nome colonna>=„? per modificato contrassegnato campi

  • Valore — Aggiungere “?„ seguito dal separatore, ad esempio “,„ o ''

  • SetFieldDirty — bit impostato lo stato modificato (ovvero.) campo modificato

  • SetFieldNull — bit impostato lo stato che indica valore null per il campo

  • IsFieldDirty — valore restituito di bit modifica dello stato

  • IsFieldNull — valore restituito di bit null dello stato

  • IsFieldNullable — TRUE di restituire se il campo può utilizzare i valori null

  • StoreField — valore del campo di

  • LoadField — valore del campo archiviato ricarica

  • GetFieldInfoValue — informazioni generali di ritorno su un campo

  • GetFieldInfoOrdinal — informazioni generali di ritorno su un campo

Estensioni dell'utente

Esistono diversi modi per estendere il meccanismo di impostazione predefinita RFX.È possibile:

  • Aggiunta di nuovi tipi di dati.Di seguito è riportato un esempio:

    CBookmark
    
  • Aggiungere nuove procedure di scambio (RFX_???).

    void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
        BIGINT& value);
    
  • Fare nella funzione membro di DoFieldExchange includere ulteriori chiamate RFX o qualsiasi altra istruzione validi di C++.

    while (posExtraFields != NULL)
    {
        RFX_Text(pFX, m_listName.GetNext(posExtraFields), 
            m_listValue.GetNext(posExtraValues));
    }
    

[!NOTA]

Tale codice non può essere modificato da ClassWizard e deve essere utilizzato solo all'esterno dei commenti speciali di formato.

Scrittura di RFX

Per scrivere una funzione (RFX, viene suggerito che si copia una funzione esistente RFX e la modifica dei propri scopi.Selezionare la destra RFX copiare può rendere il processo molto più semplice.Alcune funzioni RFX dispongono di proprietà univoche da tenere presenti quando si decide quale copiare.

  • RFX_Long and RFX_Int:
    Queste sono le funzioni RFX più semplici.Il valore dei dati non è necessaria alcuna interpretazione speciale e le dimensioni dei dati è fissa.

  • RFX_Single and RFX_Double:
    Come RFX_Long e RFX_Int precedente, queste funzioni sono semplici e potrebbero utilizzare ampiamente l'implementazione predefinita.Vengono archiviate in dbflt.cpp anziché dbrfx.cpp, tuttavia, per consentire il caricamento della libreria di runtime di virgola mobile solo quando sono in modo esplicito di riferimento.

  • RFX_Text and RFX_Binary:
    Queste due funzioni preassegnano un buffer statico per utilizzare la stringa/informazioni binarie e deve registrare i buffer con ODBC SQLBindCol anziché registrare il &value.Per questo motivo, queste due funzioni presentano quantità di codice speciale.

  • RFX_Date:
    ODBC restituisce informazioni su data e ora nella propria struttura dei dati di TIMESTAMP_STRUCT.Questa funzione alloca dinamicamente un TIMESTAMP_STRUCT come “get„ per l'invio e la ricezione dei dati relativi alla data di tempo.Le varie operazioni devono portare le informazioni su data e ora tra l'oggetto C++ CTime e il proxy di TIMESTAMP_STRUCT.Ciò potrebbe risultare molto questa funzione, ma è un buon esempio di come utilizzare un proxy per il trasferimento dei dati.

  • RFX_LongBinary:
    Ciò è l'unica funzione della libreria di classi RFX che non utilizza l'associazione di colonna per ricevere e inviare i dati.Questa funzione ignora l'operazione di BindFieldToColumn e viceversa, durante l'operazione di correzione, alloca memoria per utilizzare i dati in ingresso di SQL_LONGVARBINARY o di SQL_LONGVARCHAR, quindi esegue una chiamata di SQLGetData per recuperare il valore che è stata allocata.Nel preparare inviare i valori dei dati nell'origine dati (ad esempio NameValue e stimare le operazioni), questa funzione utilizza la funzionalità di DATA_AT_EXEC ODBC.Vedere nota tecnica 45 per ulteriori informazioni sull'utilizzo SQL_LONGVARBINARY e SQL_LONGVARCHARs.

In scrivere una funzione di RFX_ , sarà possibile spesso utilizzare CFieldExchange::Default per implementare una determinata operazione.Esaminare l'implementazione di impostazione predefinita per l'operazione in questione.Se l'azione si scrive nella funzione di RFX_ è possibile delegare CFieldExchange::Default. È possibile visualizzare esempi di chiamare CFieldExchange::Default in dbrfx.cpp

È importante chiamare IsFieldType inizio della funzione RFX e restituisce immediatamente un valore se restituisce FALSE.Questo meccanismo consente di mantenere le operazioni di parametro venga eseguito su outputColumnse viceversa (come chiamare BindParam su outputColumn).Inoltre, IsFieldType automaticamente tiene traccia del numero di outputColumns (m_nFields) e di params (m_nParams).

Vedere anche

Altre risorse

Note tecniche del numero

Note tecniche per categoria