Wymiana pól rekordów: jak działa RFX

W tym temacie opisano proces RFX. Jest to zaawansowany temat obejmujący:

Uwaga

Ten temat dotyczy klas pochodnych CRecordset , z których pobieranie wierszy zbiorczych nie zostało zaimplementowane. Jeśli używasz zbiorczego pobierania wierszy, implementowana jest wymiana pól rekordów zbiorczych (Bulk RFX). Zbiorcze RFX jest podobne do RFX. Aby zrozumieć różnice, zobacz Zestaw rekordów: pobieranie rekordów zbiorczo (ODBC).

RFX i zestaw rekordów

Składowe danych pola obiektu zestawu rekordów, połączone, stanowią bufor edycji, który zawiera wybrane kolumny jednego rekordu. Gdy zestaw rekordów jest najpierw otwarty i ma odczytać pierwszy rekord, RFX wiąże (kojarzy) każdą wybraną kolumnę z adresem odpowiedniego elementu członkowskiego danych pola. Gdy zestaw rekordów aktualizuje rekord, RFX wywołuje funkcje interfejsu API ODBC w celu wysłania instrukcji SQL UPDATE lub INSERT do sterownika. RFX wykorzystuje swoją wiedzę na temat składowych danych pól, aby określić kolumny do zapisu.

Struktura tworzy kopię zapasową buforu edycji na niektórych etapach, aby w razie potrzeby mogła przywrócić jego zawartość. RFX tworzy kopię zapasową buforu edycji przed dodaniem nowego rekordu i przed edycją istniejącego rekordu. Przywraca bufor edycji w niektórych przypadkach, na przykład po wywołaniu następującego Update polecenia AddNew. Bufor edycji nie zostanie przywrócony, jeśli porzucisz nowo zmieniony bufor edycji, na przykład przenosząc się do innego rekordu przed wywołaniem metody Update.

Oprócz wymiany danych między źródłem danych a elementami członkowskimi danych pola zestawu rekordów RFX zarządza parametrami powiązania. Po otwarciu zestawu rekordów wszystkie składowe danych parametrów są powiązane w kolejności symboli zastępczych "?" w instrukcji SQL, która CRecordset::Open tworzy. Aby uzyskać więcej informacji, zobacz Zestaw rekordów: parametryzacja zestawu rekordów (ODBC).

Zastąpienie klasy zestawu rekordów DoFieldExchange wykonuje całą pracę, przenosząc dane w obu kierunkach. Podobnie jak w przypadku wymiany danych dialogowych (DDX), RFX potrzebuje informacji o składowych danych klasy. Kreator udostępnia niezbędne informacje, pisząc implementację zestawu rekordów DoFieldExchange na podstawie nazw składowych danych pól i typów danych określonych za pomocą kreatora.

Proces wymiany pól rekordów

W tej sekcji opisano sekwencję zdarzeń RFX jako otwarty obiekt zestawu rekordów oraz podczas dodawania, aktualizowania i usuwania rekordów. W tabeli Sekwencja operacji RFX podczas otwierania zestawu rekordów i tabeli Sekwencja operacji RFX podczas przewijania w tym temacie przedstawiono proces, gdy RFX przetwarza Move polecenie w zestawie rekordów i gdy RFX zarządza aktualizacją. Podczas tych procesów wywoływana jest funkcja DoFieldExchange w celu wykonywania wielu różnych operacji. Element m_nOperation członkowski danych obiektu CFieldExchange określa, która operacja jest żądana. Warto przeczytać zestaw rekordów: Jak zestawy rekordów wybierają rekordy (ODBC) i zestaw rekordów: jak zestawy rekordów aktualizują rekordy (ODBC) przed przeczytaniem tego materiału.

RFX: początkowe powiązanie kolumn i parametrów

Następujące działania RFX występują w pokazanej kolejności podczas wywoływania funkcji elementu członkowskiego Open obiektu zestawu rekordów:

  • Jeśli zestaw rekordów ma składowe danych parametrów, struktura wywołuje metodę DoFieldExchange powiązania parametrów z symbolami zastępczymi parametrów w ciągu instrukcji SQL zestawu rekordów. Reprezentacja zależna od typu danych wartości parametru jest używana dla każdego symbolu zastępczego znalezionego w instrukcji SELECT . Dzieje się tak po przygotowaniu instrukcji SQL, ale przed jej wykonaniem. Aby uzyskać informacje o przygotowaniu instrukcji, zobacz ::SQLPrepare funkcję w dokumentacji programisty ODBC.

  • Struktura wywołuje DoFieldExchange drugi raz, aby powiązać wartości wybranych kolumn z odpowiednimi elementami członkowskimi danych pól w zestawie rekordów. Spowoduje to utworzenie obiektu zestawu rekordów jako buforu edycji zawierającego kolumny pierwszego rekordu.

  • Zestaw rekordów wykonuje instrukcję SQL, a źródło danych wybiera pierwszy rekord. Kolumny rekordu są ładowane do składowych danych pola zestawu rekordów.

W poniższej tabeli przedstawiono sekwencję operacji RFX podczas otwierania zestawu rekordów.

Sekwencja operacji RFX podczas otwierania zestawu rekordów

Operacja Operacja DoFieldExchange Operacja bazy danych/SQL
1. Otwórz zestaw rekordów.
2. Utwórz instrukcję SQL.
3. Wyślij sql.
4. Powiąż składowe danych parametrów.
5. Powiąż elementy członkowskie danych pól z kolumnami.
6. ODBC wykonuje przeniesienie i wypełnia dane.
7. Napraw dane dla języka C++.

Zestawy rekordów używają przygotowanego wykonania ODBC, aby umożliwić szybkie ponowne wykonywanie za pomocą tej samej instrukcji SQL. Aby uzyskać więcej informacji o przygotowanym wykonaniu, zobacz dokumentację programisty ODBC.

RFX: przewijanie

Podczas przewijania z jednego rekordu do innego struktura wywołuje metodę DoFieldExchange w celu zastąpienia wartości wcześniej przechowywanych w elementach członkowskich danych pola wartościami dla nowego rekordu.

W poniższej tabeli przedstawiono sekwencję operacji RFX, gdy użytkownik przechodzi z rekordu do rekordu.

Sekwencja operacji RFX podczas przewijania

Operacja Operacja DoFieldExchange Operacja bazy danych/SQL
1. Wywołaj MoveNext lub jedną z innych funkcji Move.
2. ODBC wykonuje przenoszenie i wypełnia dane.
3. Napraw dane dla języka C++.

RFX: dodawanie nowych rekordów i edytowanie istniejących rekordów

W przypadku dodania nowego rekordu zestaw rekordów działa jako bufor edycji w celu skompilowania zawartości nowego rekordu. Podobnie jak w przypadku dodawania rekordów, edytowanie rekordów obejmuje zmianę wartości składowych danych pola zestawu rekordów. Z perspektywy RFX sekwencja jest następująca:

  1. Wywołanie funkcji AddNew lub Edit elementu członkowskiego zestawu rekordów powoduje, że RFX przechowuje bieżący bufor edycji, aby można było przywrócić go później.

  2. AddNew lub Edit przygotowuje pola w buforze edycji, dzięki czemu RFX może wykrywać zmienione składowe danych pól.

    Ponieważ nowy rekord nie ma poprzednich wartości do porównania nowych, AddNew ustawia wartość każdego elementu członkowskiego danych pola na wartość PSEUDO_NULL. Później po wywołaniu Updatewywołania RFX porównuje wartość każdego elementu członkowskiego danych z wartością PSEUDO_NULL. Jeśli istnieje różnica, element członkowski danych został ustawiony. (PSEUDO_NULL nie jest taka sama jak kolumna rekordu z wartością true Null ani nie jest taka sama jak wartość NULL języka C++).

    W przeciwieństwie do wywołania Update metody AddNewUpdate , wywołanie metody Edit porównuje zaktualizowane wartości z wcześniej przechowywanymi wartościami, a nie przy użyciu PSEUDO_NULL. Różnica polega na tym, że AddNew nie ma wcześniej przechowywanych wartości do porównania.

  3. Bezpośrednio ustawiasz wartości elementów członkowskich danych pól, których wartości chcesz edytować lub które mają zostać wypełnione dla nowego rekordu. Może to obejmować wywołanie .SetFieldNull

  4. Wywołanie funkcji Update sprawdza zmienione składowe danych pól zgodnie z opisem w kroku 2 (zobacz tabelę Sekwencja operacji RFX podczas przewijania). Jeśli żadna z nich nie uległa zmianie, Update zwraca wartość 0. Jeśli niektóre elementy członkowskie danych pól uległy zmianie, Update przygotowuje i wykonuje instrukcję SQL INSERT zawierającą wartości dla wszystkich zaktualizowanych pól w rekordzie.

  5. W przypadku AddNewparametru Update kończy się przywrócenie poprzednio przechowywanych wartości rekordu AddNew , który był bieżący przed wywołaniem. W przypadku Editelementu nowe, edytowane wartości pozostają na miejscu.

W poniższej tabeli przedstawiono sekwencję operacji RFX podczas dodawania nowego rekordu lub edytowania istniejącego rekordu.

Sekwencja operacji RFX podczas dodawaniaNowy i edycja

Operacja Operacja DoFieldExchange Operacja bazy danych/SQL
1. Zadzwoń AddNew lub Edit.
2. Utwórz kopię zapasową buforu edycji.
3. W przypadku AddNewelementu oznacz elementy członkowskie danych pól jako "czyste" i Null.
4. Przypisz wartości do składowych danych pól zestawu rekordów.
5. Zadzwoń do .Update
6. Sprawdź zmienione pola.
7. Skompiluj instrukcję SQL INSERT dla AddNew instrukcji UPDATE lub dla .Edit
8. Wyślij sql.
9. W przypadku AddNewpolecenia przywróć bufor edycji do jego zawartości kopii zapasowej. W przypadku Editpolecenia usuń kopię zapasową.

RFX: usuwanie istniejących rekordów

Po usunięciu rekordu RFX ustawia wszystkie pola na WARTOŚĆ NULL jako przypomnienie, że rekord zostanie usunięty i musisz go wyłączyć. Nie potrzebujesz żadnych innych informacji o sekwencji RFX.

Zobacz też

Wymiana pól rekordów (RFX)
Zużycie MFC ODBC
Makra, funkcje globalne i zmienne globalne
Klasa CFieldExchange
CRecordset::D oFieldExchange