TN053: Niestandardowe DFX procedur dla klas bazy danych DAO

Ta Uwaga techniczna zawiera opis mechanizmu wymiany (DFX) w polu rekordu DAO. Aby lepiej zrozumieć, co się dzieje w procedur DFX, funkcja DFX_Text zostaną wyjaśnione szczegółowo jako przykład. Jako dodatkowe źródło informacji, aby ta Uwaga techniczna można po prostu sprawdzić kod dla innych poszczególnych funkcji DFX.Prawdopodobnie nie będzie trzeba niestandardowe rutynowych DFX tak często jak będziesz potrzebować niestandardowe rutynowych RFX (używane z klasami baz danych ODBC).

Ta Uwaga techniczna zawiera:

Omówienie DFX

Mechanizmu wymiany pola rekordów DAO (DFX) jest używany do uproszczenia procedury pobierania i aktualizowanie danych, gdy za pomocą klasy CDaoRecordset . Proces jest uproszczone poprzez korzystanie z danych członkowie klasy CDaoRecordset . Przez wynikające z CDaoRecordset, można dodawać członków danych w klasie pochodnej reprezentujące każde pole w tabeli lub kwerendzie. Ten mechanizm „statyczne wiązanie"jest proste, ale nie może być metoda pobrania/aktualizacja danych wyboru dla wszystkich aplikacji. DFX pobiera każde pole związane każdej zmianie bieżącego rekordu. W wypadku opracowywania aplikacji zależne od wydajności, która nie wymaga pobieranie wszystkich pól, gdy zostanie zmieniona waluta, "dynamiczne wiązanie" poprzez CDaoRecordset::GetFieldValue i CDaoRecordset::SetFieldValue może być metodą wyboru dostępu do danych.

Uwaga   DFX i dynamiczne wiązanie nie są wzajemnie wykluczające, tak aby wykorzystanie hybrydowe powiązania statycznych i dynamicznych można używać.

Przykład 1 - użycie wymiany pól rekordów DAO tylko

(zakłada CDaoRecordset - pochodną klasy CMySet już otwarty)

/ / Dodanie nowego rekordu do tabeli Klienci
mySet.AddNew();
mySet.m_strCustID = _T("MSFT");
mySet.m_strCustName = _T("Microsoft");
mySet.Update()

Przykład 2 - użyj tylko dynamiczne wiązanie

(zakłada się, za pomocą klasy CDaoRecordset , rs , i jest już otwarty)

/ / Dodanie nowego rekordu do tabeli Klienci
COleVariantnbsp; varFieldValue1 (_T("MSFT"), VT_BSTRT);
/ / Uwaga: VT_BSTRT flagi typu ciąg jako A&NSI, zamiast domyślnego UNICODE
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT);
r.AddNew();
r.SetFieldValue(_T("Customer_ID"), varFieldValue1);
r.SetFieldValue(_T("Customer_Name"), varFieldValue2);
r.Update()

Przykład 3 - wymiany pól rekordów DAO I dynamiczne wiązanie

(zakłada przeglądania danych pracownika z CDaoRecordset-klasy emp )

/ / Get danych pracownika, aby mogły być wyświetlone
EMP.MoveNext();

/ / Jeżeli użytkownik chce zobaczyć zdjęcie pracownika,
/ / pobranie go
COleVariant varPhoto;
Jeżeli (bSeePicture)
EMP.GetFieldValue(_T("photo"), varPhoto);

/ / Wyświetlania danych
PopUpEmployeeData (emp.m_strFirstName,
 EMP.m_strLastName, varPhoto)

Jak działa DFX

Mechanizm DFX działa w podobny sposób do mechanizmu wymiany (RFX) w polu rekordu użytkowana przez klas MFC ODBC. Priciples DFX i RFX są takie same, ale istnieją liczne różnice. Projekt funkcji DFX była taka, że niemal cały kod jest współużytkowany przez indywidualnych procedur DFX. Na najwyższym poziomie DFX tylko wykonuje kilka czynności.

Istotą DFX mechanizmu jest klasa CDaoRecordset pochodnych DoFieldExchange funkcji. Ta funkcja wywołuje wzywa poszczególne funkcje DFX typu odpowiedniej czynności. Przed do wywoływania DoFieldExchange wewnętrznego MFC funkcji Ustaw typ operacji. Na poniższej liście przedstawiono różne rodzaje operacji i krótki opis.

Operacja Opis
AddToParameterList Buduje klauzuli parametrów
AddToSelectList Klauzula SELECT kompilacje
BindField Konfiguruje struktura wiązania
BindParam Ustawia wartości parametrów
Korekty Ustawia stan NULL
AllocCache Przydziela pamięć podręczną dla wyboru brudny
StoreField Zapisuje bieżący rekord w pamięci podręcznej
LoadField Przywraca pamięci podręcznej do wartości elementów członkowskich
FreeCache Zwalnia pamięć podręczna
SetFieldNull Ust&awia pole Stan amp; wartość null
MarkForAddNew Znaków pól dirty jeśli nie PSEUDO NULL
MarkForEdit Znaków pól dirty jeśli nie pasują do pamięci podręcznej
SetDirtyField Ustawia pole wartości oznaczony jako zanieczyszczony

W następnej sekcji każdej operacji zostaną wyjaśnione bardziej szczegółowo dla DFX_Text.

Najważniejszych funkcji zrozumieć dotyczących procesu wymiany pola rekordów DAO jest, korzysta z funkcji GetRows obiektu ICDaoRecordset . Funkcja DAO GetRows można pracować na kilka sposobów. Ta Uwaga techniczna będzie tylko pokrótce opisujący GetRows , jest poza zakresem niniejszej Uwaga techniczna.

DAO GetRows można pracować na kilka sposobów.

Czego rutynowych DFX twój niestandardowy

Wynika z tej dyskusji, że najważniejsze działania realizowane w dowolnej funkcji DFX musi być możliwość stworzenia struktur danych wymagany do pomyślnego wywołania GetRows. Istnieje pewna liczba innych działań, które funkcja DFX musi obsługiwać także, ale żaden jako ważne ani złożonych jako prawidłowego przygotowania GetRows wywołania.

Wykorzystanie DFX jest opisane w dokumentacji online. Zasadniczo istnieją 2 wymogi. Po pierwsze członkowie muszą zostać dodane do klasy CDaoRecordset pochodnych dla każdego pola związanego i parametr. Po tym CDaoRecordset::DoFieldExchange powinna zostać zastąpiona. Należy zwrócić uwagę, że typ danych członka jest ważne. Powinno pasować do danych z pola w bazie danych lub przynajmniej być convertable do tego typu. Na przykład pola liczbowego w bazie danych, takie jak liczba całkowita długa, można zawsze być konwertowane na tekst i powiązane z członkiem CString , ale pole tekstowe w bazie danych niekoniecznie mogą być konwertowane na numeryczną reprezentację, takich jak długa i powiązany z członkiem długa. DAO i aparat bazy danych Microsoft Jet są odpowiedzialne za konwersji (zamiast MFC).

Szczegółowe informacje o DFX_Text

Jak wspomniano wcześniej, prawdopodobnie najlepszym sposobem wyjaśnić, w jaki sposób działa DFX jest po prostu pracować przez przykładowy. W tym celu przechodzące przez wewnętrzne DFX_Text powinny całkiem dobrze działać przyczyniać się do dostarczania co najmniej podstawowego zrozumienia DFX.

AddToParameterList

Ta operacja buduje klauzuli SQL Parametry (" Parameters lt;param name>, <param type> ... ; ") wymaganego przez aparat Jet. Każdy parametr o nazwie i wpisane (jak określono w wywołaniu RFX). Zobacz opis funkcji funkcji CDaoFieldExchange::AppendParamType , aby wyświetlić nazwy poszczególnych rodzajów. Z DFX_Textjest typ używanychtext.

AddToSelectList

Buduje klauzuli SQL, Zaznacz . To jest dość prosty jako nazwa kolumny określone przez wywołanie DFX jest po prostu dołączany (" SELECT lt;column name>, ... ").

BindField

-Zdecydowanie najbardziej złożonych operacji. Jak wspomniano powyżej, że to jest, gdy zdefiniowano struktury powiązanie DAO, używany przez metodę GetRows . Jak widać z kodu w DFX_Text typów informacji w strukturze zawierają typ DAO używany (DAO_CHAR lub DAO_WCHAR pod DFX_Text). Ponadto ustawiono typ powiązania używane w górę. W sekcji wyżej GetRows podano tylko przez krótki czas, ale było wystarczające do wyjaśnienia, że typ powiązania używane przez MFC jest zawsze bezpośredni adres wiązania (DAOBINDING_DIRECT). Dodatkowo dla zmiennej długości kolumny wiązania (jak DFX_Text) wiązania wywołania zwrotnego jest używane tak, aby MFC można sterować alokacji pamięci i określić adres właściwą długość. Oznacza to że MFC zawsze stwierdzić DAO "gdzie" umieścić dane, umożliwiając w ten sposób wiązania bezpośrednio do zmiennych. Reszta struktury powiązanie jest wypełniane narządzi adresu funkcji wywołania zwrotnego alokacji pamięci i rodzaj powiązań kolumn (wiążące przez nazwę kolumny).

BindParam

Jest to prostą, która wywołuje SetParamValue z wartością parametru określonego członka parametr.

Korekty

Wypełnia ZEROWY stan dla każdego pola.

SetFieldNull

Ta operacja tylko znaki każdy stan pola jako wartość NULL i ustawia członka wartość zmiennej PSEUDO_NULL.

SetDirtyField

Wywołania SetFieldValue dla każdego pola oznaczone brudny.

Wszystkie pozostałe operacje zajmuje tylko przy użyciu pamięci podręcznej danych. Pamięć podręczna danych jest dodatkowa bufor dane z bieżącego rekordu, który jest używany do utworzenia niektóre rzeczy prostsze. Na przykład pola "dirty" mogą być automatycznie wykrywane. Opisane w dokumentacji online, które to może zostać wyłączone całkowicie lub na poziomie pola. Wdrożenie bufor wykorzystuje mapy. Ta mapa służy do dopasowywania się dynamicznie przydzielanego kopie danych z adresu "związane" pola (lub członek danych derieved CDaoRecordset ).

AllocCache

Dynamicznie przydziela wartość pola buforowany i dodaje go do mapy.

FreeCache

Usuwa wartość pola buforowany i usuwa ją z mapy.

StoreField

Skopiowanie bieżącej wartości pola do pamięci podręcznej danych.

LoadField

Kopiuje wartość buforowana członek pola.

MarkForAddNew

Kontrole, jeśli bieżąca wartość pola jest brak-NULL i znaki dirty w razie potrzeby.

MarkForEdit

Porównuje bieżącą wartość pola z pamięci podręcznej danych i znaki brudny, w razie potrzeby.

Porada   Wzór niestandardowych procedur DFX na istniejących procedur DFX standardowych typów.

Uwagi techniczne przez liczbę |nbsp; Uwagi techniczne według kategorii

Index