Udostępnij za pośrednictwem


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

Zobacz też

Inne zasoby

Uwagi techniczne przez liczbę

Uwagi techniczne według kategorii