TN043: Procedury RFX
[!UWAGA]
Następujące Uwaga techniczna została zaktualizowana, ponieważ najpierw została uwzględniona w dokumentacji online.W rezultacie niektóre procedur i tematów może być nieaktualne lub nieprawidłowe.Najnowsze informacje zaleca się wyszukać temat zainteresowanie Indeks dokumentacji online.
Uwaga ta opisuje architekturę wymiany (RFX) w polu rekordu.Opisano również sposób zapisu RFX_ procedury.
Omówienie wymiany pola rekordu
Wszystkie funkcje pola rekordów są wykonywane z kodu C++.Nie ma specjalnych zasobów i magiczne makra.Serce mechanizm jest wirtualny funkcji, która musi zostać zastąpiony w każdej klasy pochodnej rekordów.Zawsze znajduje się w tym formularzu:
void CMySet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CMySet)
<recordset exchange field type call>
<recordset exchange function call>
//}}AFX_FIELD_MAP
}
Uwagi specjalne format AFX umożliwia ClassWizard zlokalizować i edytować kod w tej funkcji.Kod, który nie jest zgodny z ClassWizard powinny umieszczony poza komentarze specjalny format.
W powyższym przykładzie, <recordset_exchange_field_type_call> jest w formie:
pFX->SetFieldType(CFieldExchange::outputColumn);
i <recordset_exchange_function_call> jest w formie:
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 opcjonalne argumenty.
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 z MFC.
Wywołania pola rekordów są sposób Rejestrowanie lokalizacji pamięci (zwykle danych członków) do przechowywania danych pola dla CMySet klasy.
Notatki
Funkcje pola rekordów są zaprojektowane do pracy tylko z CRecordset klasy.Nie są one ogólnie stosowanych przez innych klas MFC.
Początkowe wartości danych są ustawione w konstruktorze standard C++, zazwyczaj 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 stan pola do pola w przygotowaniu do edycji pola archiwizacji.
Każda funkcja, która wywołuje DoFieldExchange (na przykład SetFieldNull, IsFieldDirty), jest inicjalizacji wokół wywołanie DoFieldExchange.
Jak działa?
Nie trzeba zrozumieć następujące do korzystania z programu exchange w polu rekordu.Jednakże zrozumienia, jak to działa w tle będą pomocne pisać własne procedury wymiany.
DoFieldExchange Członkowskich funkcji przypomina Serialize Członkowskich funkcji — jest odpowiedzialny za ustawianie i pobieranie danych do/z/do danych w klasie z formularza zewnętrznych (w tym sprawa kolumny z wyniku kwerendy ODBC).pFX Parametr jest kontekstem, takie rozwiązanie wymiany danych i jest podobny do CArchive parametr CObject::Serialize.pFX ( CFieldExchange Obiektu) zawiera wskaźnik operacji, który jest podobny do, ale generalizacji z CArchive Flaga kierunku.Funkcja RFX może mieć do obsługi następujących operacji:
BindParam — wskazanie, gdzie ODBC należy pobierać danych parametru
BindFieldToColumn — wskazanie gdzie ODBC muszą pobierać/depozyt outputColumn danych
Korekty — Set CString/CByteArray długości, ustawianie stanu NULL bit
MarkForAddNew — znak dirty, jeśli wartość została zmieniona, ponieważ wywołanie AddNew
MarkForUpdate — znak dirty, jeśli wartość została zmieniona, ponieważ wywołanie 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— Ustawić stan bit zanieczyszczenia (tj.zmienione) pole
SetFieldNull— Ustawia bit stanu wskazujący wartość null dla pola
IsFieldDirty— Zwraca wartość stanu dirty bit
IsFieldNull— Zwraca wartość null stan bit
IsFieldNullable— Zwraca TRUE jeśli pole może zawierać wartości NULL
StoreField — archiwizowanie wartości pola
LoadField — Reload zarchiwizowane wartość pola
GetFieldInfoValue — zwraca informacje ogólne w polu
GetFieldInfoOrdinal — zwraca informacje ogólne w polu
Rozszerzenia użytkownika
Aby rozszerzyć domyślnego mechanizmu RFX na wiele sposobów.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 wywołania RFX lub inne ważne instrukcje języka C++.
while (posExtraFields != NULL) { RFX_Text(pFX, m_listName.GetNext(posExtraFields), m_listValue.GetNext(posExtraValues)); }
[!UWAGA]
Taki kod nie mogą być edytowane przez ClassWizard i powinny być stosowane tylko poza komentarze specjalny format.
Pisanie niestandardowych RFX
Pisanie własnych funkcji niestandardowe RFX, zalecane jest skopiowanie istniejącej funkcji RFX i zmodyfikować go do własnych celów.Prawo RFX, aby skopiować zaznaczenie może ułatwić zadanie znacznie.Niektóre funkcje RFX mają unikalne właściwości, które należy wziąć pod uwagę przy podejmowaniu decyzji do skopiowania.
RFX_Long i RFX_Int:
Są to najprostszy funkcji RFX.Wartość danych nie wymaga żadnych specjalnych interpretacji i rozmiar danych jest ustalona.RFX_Single i RFX_Double:
Podobnie jak RFX_Long i RFX_Int powyżej, te funkcje są proste i może używać realizacji domyślne wszechstronnie.Są one przechowywane w dbflt.cpp zamiast dbrfx.cpp, jednak, aby włączyć ładowanie runtime, pływające biblioteki punkt tylko wtedy, gdy są one wyraźnie odwołanie.RFX_Text i RFX_Binary:
Te dwie funkcje przydzielenia statyczne buforu do przechowywania informacji binarnych/ciąg i zarejestrować bufory z Procedura SQLBindCol ODBC zamiast rejestrowanie & wartości.Z tego powodu te dwie funkcje mają wiele przypadek specjalny kod.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 muszą transferu informacji daty i godziny 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 tylko biblioteki klas funkcji RFX, która nie używa powiązań kolumn do odbierania i wysyłania danych.Ta funkcja ignoruje operacji BindFieldToColumn, podczas operacji korektę przydziela magazynu do przechowywania przychodzących danych SQL_LONGVARCHAR lub SQL_LONGVARBINARY, a następnie wykonuje wywołanie SQLGetData do pobierania wartości do przydzielonego składowania.Podczas przygotowywania do wysłania danych wartości z powrotem do źródła danych (takich jak operacje NameValue i wartości), ta funkcja używa funkcji DATA_AT_EXEC ODBC's.Zobacz technicznej 45 Uwaga Aby uzyskać więcej informacji na temat pracy z SQL_LONGVARBINARY i SQL_LONGVARCHARs.
Podczas pisania własnych RFX_ funkcji, często będzie mógł używać CFieldExchange::Default do przeprowadzenia danej operacji.Przyjrzyj się wykonania domyślny dla danego działania.Jeżeli wykonuje operację będzie pisanie w sieci RFX_ funkcji można delegować do CFieldExchange::Default. Można zobaczyć przykłady wywołania CFieldExchange::Default w dbrfx.cpp
Jest ważne, aby wywołać IsFieldType na początku RFX funkcji i zwracane natychmiast, jeżeli zwraca wartość FALSE.Ten mechanizm przechowuje parametr operacji wykonywanej na outputColumnsi odwrotnie (takich jak wywołania BindParam na outputColumn).Ponadto IsFieldType automatycznie informacje o liczbę outputColumns (m_nFields) i params (m_nParams).