Udostępnij za pośrednictwem


TN043: procedury RFX

[!UWAGA]

Następująca uwaga techniczna nie został zaktualizowana od pierwszego uwzględnienia jej w dokumentacji online.W rezultacie niektóre procedury i tematy może być nieaktualne lub nieprawidłowe.Aby uzyskać najnowsze informacje, zaleca się wyszukać temat w indeksie dokumentacji online.

Ta notatka zawiera opis architektury exchange (RFX) pole rekordu.Opisano w niej także sposobu pisania RFX_ procedury.

Omówienie wymiany pól rekordu

Wszystkie funkcje pola rekordów są wykonane z kodem w języku C++.Nie ma żadnych specjalnych zasobów lub magic makra.Serce mechanizmu jest funkcji wirtualnych, która musi zostać zastąpiona w każdej klasie pochodnej zestawu rekordów.Znajduje się zawsze w tym formularzu:

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

Specjalny format AFX komentarze pozwalają ClassWizard do zlokalizowania i edytować kod w ramach tej funkcji.Kod, który nie jest zgodny z ClassWizard powinny być umieszczone poza komentarze specjalny format.

W powyższym przykładzie <recordset_exchange_field_type_call> jest w postaci:

pFX->SetFieldType(CFieldExchange::outputColumn);

i <recordset_exchange_function_call> jest w postaci:

RFX_Custom(pFX, "Col2", m_Col2);

Większość RFX_ funkcje mają trzy argumenty, jak wykazano powyżej, ale niektóre (np.RFX_Texti RFX_Binary) mają dodatkowe argumenty opcjonalne.

Więcej niż jeden RFX_ mogą być zawarte w każdej DoDataExchange funkcji.

Zobacz "afxdb.h", aby uzyskać listę wszystkich rekordów pole wymiany procedur wyposażone MFC.

Wywołania pola rekordów są sposób rejestracji lokalizacji pamięci (zazwyczaj danych członków) do przechowywania danych pola dla CMySet klasy.

Uwagi

Funkcje pola rekordów są przeznaczone do pracy tylko z CRecordset klas.Nie są one zazwyczaj mogą być używane przez innych klas MFC.

Wartości początkowych danych są ustawione w Konstruktorze standard C++, zwykle w blok z //{{AFX_FIELD_INIT(CMylSet) i //}}AFX_FIELD_INIT komentarze.

Każdy RFX_ funkcja musi obsługiwać różne operacje, począwszy od powrotu dirty stanu tego pola do archiwizacji pola w przygotowaniu do edycji pola.

Każda funkcja, który wywołuje DoFieldExchange (na przykład SetFieldNull, IsFieldDirty), czy inicjowania wokół wywołanie DoFieldExchange.

Jak to działa?

Nie ma potrzeby poprawnego korzystania z wymiany pól rekordów poniższy.Jednak zrozumienie, że jak to działa w tle pomoże Ci napisać własne procedury wymiany.

DoFieldExchange Funkcji składowej jest bardzo podobny do Serialize funkcji składowej — jest odpowiedzialny za uzyskiwanie lub ustawienia danych do/z zewnętrznych formularza (w tym przypadku kolumn w wynikach kwerendy ODBC) z/do danych elementu członkowskiego w klasie.pFX Parametr jest kontekstem, umożliwiające wymianę danych i jest podobny do CArchive parametru do CObject::Serialize.pFX ( CFieldExchange Obiektu) ma wskaźnik operacji, który jest podobny do, ale uogólnienie CArchive Flaga kierunek.Funkcja RFX mogą mieć do obsługi następujących operacji:

  • BindParam — wskazanie, gdzie ODBC należy pobrać danych parametru

  • BindFieldToColumn — wskazanie gdzie ODBC musi pobrać/depozytu danych outputColumn

  • Korekty — zestaw CString/CByteArray długości, Ustaw stan NULL bit

  • MarkForAddNew — znak dirty, jeśli wartość została zmieniona od zadzwonić AddNew

  • MarkForUpdate — znak dirty, jeśli wartość została zmieniona od zadzwonić Edycja

  • Nazwa — Dołącz nazwy pól dla pola oznaczone dirty

  • NameValue — Dołącz "<nazwa kolumny>=?" dla pola oznaczone dirty

  • Wartość — Dołącz "?" następuje separatora, takie jak ',' lub ' '

  • SetFieldDirty— Ustaw stan bit zanieczyszczenia (tj.) zmienione) pole

  • SetFieldNull— Ustawia bit stanu wskazujący wartość null dla pola

  • IsFieldDirty— Zwraca wartość bitu zanieczyszczenia stan

  • IsFieldNull— Zwracają wartość null stanu bitu

  • IsFieldNullable— Zwraca TRUE jeśli pole może zawierać wartości NULL

  • StoreField — archiwizowanie wartość pola

  • LoadField — Reload zarchiwizowane wartość pola

  • GetFieldInfoValue — zwrot ogólne informacje z pola

  • GetFieldInfoOrdinal — zwrot ogólne informacje z pola

Rozszerzenia użytkownika

Istnieje kilka sposobów, aby rozszerzyć domyślnego mechanizmu RFX.Możesz

  • Dodaj nowe typy danych.Na przykład:

    CBookmark
    
  • Dodawanie nowych procedur wymiany (RFX_?).

    void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
        BIGINT& value);
    
  • Mają DoFieldExchange funkcji składowej warunkowo obejmują dodatkowe połączenia RFX lub innych prawidłowych instrukcji języka C++.

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

[!UWAGA]

Taki kod nie może być edytowany przez ClassWizard i powinna być używana tylko poza komentarze specjalny format.

Pisanie niestandardowych RFX

Aby napisać własne funkcja niestandardowa RFX, proponuje się kopiowanie istniejącej funkcji RFX i zmodyfikować go do własnych celów.Wybieranie RFX prawo do kopiowania może ułatwić pracę znacznie.Niektóre funkcje RFX mają unikalne właściwości, które należy wziąć pod uwagę przy podejmowaniu decyzji, której mają być kopiowane.

  • RFX_Long i RFX_Int:
    Są to najprostszy funkcji RFX.Wartość danych nie wymaga żadnych specjalnych interpretacji i rozmiar danych jest stała.

  • RFX_Single i RFX_Double:
    Podobnie jak RFX_Long i RFX_Int powyżej, te funkcje są proste i może korzystać z Domyślna implementacja szeroko.Są one przechowywane w dbflt.cpp zamiast dbrfx.cpp, jednak, aby włączyć ładowanie w czasie wykonywania pływających biblioteki punkt tylko wtedy, gdy są one wyraźnie odwołanie.

  • RFX_Text i RFX_Binary:
    Te dwie funkcje wstępnie Przydziel statyczne buforu w celu przechowania informacji ciąg/binarne i musi zarejestrować bufory z ODBC SQLBindCol zamiast zarejestrować &wartość.W związku z tym te dwie funkcje posiadania dużej ilości kodu szczególne przypadki.

  • RFX_Date:
    ODBC zwraca informacje daty i godziny w ich własnej struktury danych TIMESTAMP_STRUCT.Ta funkcja dynamicznie przydziela TIMESTAMP_STRUCT jako "proxy" do wysyłania i odbierania danych czasu daty.Różne operacje trzeba przekazać informacje dotyczące daty i czasu między C++ CTime obiektu i serwera proxy TIMESTAMP_STRUCT.To znacznie komplikuje tej funkcji, ale jest dobrym przykładem sposobu użycia serwera proxy do transferu danych.

  • RFX_LongBinary:
    Jest to jedyny Biblioteka klas funkcji RFX, która nie używa powiązań kolumn do odbierania i wysyłania danych.Ta funkcja ignoruje operacji BindFieldToColumn zamiast tego podczas operacji naprawy przydziela pamięci masowej do przechowywania danych przychodzących SQL_LONGVARCHAR lub SQL_LONGVARBINARY, a następnie wykonuje wywołanie SQLGetData do pobrania wartości do przydzielonego pamięci masowej.Podczas przygotowań do wysłania wartości danych z powrotem do źródła danych (takich jak NameValue i wartość operacji), funkcja ta używa ODBC w funkcji DATA_AT_EXEC.Zobacz technicznej 45 Uwaga uzyskać więcej informacji na temat pracy z SQL_LONGVARBINARY i SQL_LONGVARCHARs.

Podczas pisania własnych RFX_ funkcji, często można używać CFieldExchange::Default do wykonania danej operacji.Spójrz na wdrożenie domyślne dla danej operacji.Jeżeli wykonuje operację można pisać swojej RFX_ funkcji można delegować do CFieldExchange::Default. Można zobaczyć przykłady telefonicznej CFieldExchange::Default w dbrfx.cpp

Ważne jest, aby wywołać IsFieldType na początku funkcji RFX i zwracane natychmiast, jeżeli zwraca wartość FALSE.Mechanizm ten przechowuje parametr operacji z wykonywanej na outputColumnsi na odwrót (podobnie jak telefonicznej BindParam na outputColumn).Dodatkowo IsFieldType automatycznie przechowuje informacje o ile outputColumns (m_nFields) oraz parametry (m_nParams).

Zobacz też

Inne zasoby

Uwagi techniczne według numerów

Uwagi techniczne według kategorii