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).