Uwaga ta opisuje architekturę wymiany (RFX) w polu rekordu. Opisano również, jak napisać procedurę RFX_.
Omówienie wymiany pola rekordu
Wszystkie funkcje pola rekordów są wykonane z kodu C++. Nie istnieją żadne specjalne zasoby lub Magiczna makra. Sercem mechanizmu jest wirtualny funkcji, która musi być zastąpiona w każdej klasie pochodnej rekordów. Zawsze znajduje się w tym formularzu:
void CMySet::DoFieldExchange (CFieldExchange * pFX)
{
//{{AFX_FIELD_MAP(CMySet)
lt; zestaw rekordów wymiany pola typ wywołania >
< wywołanie funkcji programu exchange rekordów >
//}}AFX_FIELD_MAP
}
Komentarze AFX specjalnego formatu umożliwia ClassWizard do zlokalizowania i edycji kodu w tej funkcji. Kod, który nie jest zgodny z ClassWizard powinny zostać umieszczony poza komentarze specjalnego formatu.
W powyższym przykładzie, lt; recordset_exchange_field_type_call > jest w formie:
pFX BT;SetFieldType(CFieldExchan&ge::outputColumn)
i lt; recordset_exchange_function_call > jest w formie:
RFX_Custom (pFX, "Col2", m_Col2)
Większość funkcji RFX_ posiadają trzy argumenty, jak wykazano powyżej, ale niektóre (np. RFX_Text i RFX_Binary) mają dodatkowe opcjonalne argumenty.
Więcej niż jeden RFX_ mogą być zawarte w każdej funkcji DoDataExchange.
Zobacz 'afxdb.h', aby uzyskać listę wszystkich rekordów pole wymiany procedur z MFC.
Zestaw rekordów pole wywołania są sposobem Rejestrowanie lokalizacji pamięci (zazwyczaj danych członków) do przechowywania danych pól dla klasy CMySet.
Notatki
Rekordów pole funkcji są zaprojektowane do pracy tylko z klasy CRecordset . Nie są one ogólnie stosowanych przez innych klas MFC.
Wartości początkowych danych są ustawione w konstruktora standardowej C++, zazwyczaj w bloku z //{{AFX_FIELD_INIT(CMylSet) i //}}AFX_FIELD_INIT komentarze.
Każda funkcja RFX_ musi obsługiwać różne operacje, począwszy od powrotu dirty stan pola do archiwizacji pola w przygotowania do edycji pola.
Każda funkcja, która wywołuje DoFieldExchange (np. SetFieldNull, IsFieldDirty), jest jego inicjowania wokół wywołanie DoFieldExchange.
Jak to działa?
Nie trzeba znać następujące w celu wykorzystania w polu rekordu wymiany. Jednakże ustaleń, że jak to działa w tle pomoże Ci pisać własne procedury wymiany.
Funkcja Państwa DoFieldExchange jest podobny funkcji składowej Serialize - jest ona odpowiedzialna za pobieranie lub ustawienie danych do/z/do danych klasy postaci zewnętrznych (w tym przypadku kolumn w wynikach kwerendy ODBC). Parametr pFX jest kontekst dla czynności wymiany danych i jest podobna do parametru CArchive do CObject::Serialize. PFX (obiektu CFieldExchange ) posiada wskaźnik operacji, który jest podobny do, ale generalizacji kierunek CArchive flagę. Funkcja RFX mogą mieć do obsługi następujących operacji
Użytkownika rozszerzeń
Rozszerzenie domyślnego mechanizmu RFX na wiele sposobów. Można
CBookmark
void AFXAPI RFX_Bigint(CFieldExchange* pFX, const char *szName,
nbsp; BIGINT & wartość)
podczas gdy (posExtraFields! = &NULL)
{
nbsp; RFX_Text (pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues));
}
Uwaga Taki kod nie mogą być edytowane przez ClassWizard i powinno być używane tylko poza z komentarzami specjalnego formatu.
Pisząc niestandardowy RFX
Aby napisać własną funkcję niestandardowe RFX, proponuje się, kopiowanie istniejącej funkcji RFX i zmodyfikować go do własnych celów. Wybór prawa RFX aby skopiować można wprowadzać, zadania stanie się znacznie łatwiej. Niektóre funkcje RFX mają pewne unikatowe właściwości, które należy wziąć pod uwagę przy podejmowaniu decyzji co do skopiowania.
RFX_Long i RFX_Int:
Są to najprostszy funkcji RFX. Wartość danych nie wymaga żadnych specjalnych interpretacji i ustalony rozmiar danych.
RFX_Single i RFX_Double:
Jak RFX_Long i RFX_Int powyżej, te funkcje są proste i możliwość wykorzystania Domyślna implementacja szeroko. One są przechowywane w dbflt.cpp zamiast dbrfx.cpp, jednakże aby umożliwić ładowanie runtime przestawne punkt biblioteki, tylko wtedy, gdy są one wyraźnie odniesienia.
RFX_Text i RFX_Binary:
Te dwie funkcje wstępnie przydziel st&atyczne buforu do przechowywania informacji o ciąg/binarnych i zarejestrować te buforów z Procedura SQLBindCol ODBC zamiast rejestrowanie amp; wartość. Z tego powodu te dwie funkcje dużo w przypadku specjalnego kodu.
RFX_Date:
ODBC zwraca informacje o dacie i godzinie 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 przekazać informacje dotyczące daty i czasu między obiektem C++ CTime a TIMESTAMP_STRUCT serwera proxy. Z ustalaniem to znacznie komplikuje tej funkcji, ale jest dobrym przykładem tego, jak używać serwera proxy dla transferu danych.
RFX_LongBinary:
Jest to jedynie biblioteka klas funkcji RFX, która nie używać powiązań kolumn do odbierania i wysyłania danych. Funkcja ta ignoruje operacji BindFieldToColumn i zamiast tego podczas operacji korektę 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 składowania. Podczas przygotowywania do wysyłania wartości danych do źródła danych (czyli operacji NameValue i wartości), to funkcja korzystająca ODBC firmy DATA_AT_EXEC funkcji. Zobacz technicznych 45 Uwaga Aby uzyskać więcej informacji na temat pracy z SQL_LONGVARBINARY i SQL_LONGVARCHARs.
Podczas pisania własnych funkcji RFX_ , często będzie mógł używać CFieldExchange::Default do wykonania danej operacji. Spójrz na wdrożenie domyślny dla danego działania. Jeśli wykonuje operację pisania byłoby w funkcji RFX_ można delegować do CFieldExchange::Default. Zobacz przykłady wywołanie CFieldExchange::Default w dbrfx.cpp
Jest ważne, aby wywołać IsFieldType na początku funkcji RFX i niezwłocznego zwrotu, jeżeli zwraca wartość FALSE. Mechanizm ten zachowuje parametru operacji wykonywanej na outputColumnsi na odwrót (takie jak wywoływanie BindParam na outputColumn). Ponadto IsFieldType automatycznie śledzi śledzenie przez hrabiego outputColumns (m_nFields) i params (m_nParams).
Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii