TN053: niestandardowe procedury DFX dla klas baz danych DAO
[!UWAGA]
Począwszy od programu Visual C++ .NET środowiska Visual C++ i kreatorów już obsługiwać DAO (choć znajdują się klasy DAO i nadal można używać).Firma Microsoft zaleca użycie Szablonów OLE DB lub ODBC i MFC dla nowych projektów.W utrzymaniu istniejących aplikacji należy używać tylko obiektów DAO.
Ta uwaga techniczna opisano mechanizm wymiany (DXF) pole rekordu DAO.Aby pomóc zrozumieć, co się dzieje w procedurach DXF, DFX_Text funkcji zostaną wyjaśnione szczegółowo jako przykład.Jako dodatkowe źródło informacji, aby ta uwaga techniczna można sprawdzić kod dla innych poszczególne funkcje DXF.Użytkownik nie będzie prawdopodobnie konieczne niestandardowe rutynowych DXF tak często, jak to może być konieczne niestandardowe procedury RFX (używany z klasami baz danych ODBC).
Ta uwaga techniczna zawiera:
Omówienie DXF
Przykłady za pomocą wymiany pól rekordów DAO i wiązanie dynamiczne
Jak działa DXF
Co robi rutynowych niestandardowe DXF
Szczegóły DFX_Text
Omówienie DXF
Mechanizm wymiany pole rekordu DAO (DXF) jest używany do uproszczenia procedury, pobieranie i aktualizowanie danych przy użyciu CDaoRecordset klasy.Upraszcza proces przy użyciu danych członków CDaoRecordset klasy.Za wynikające z CDaoRecordset, pochodne klasy reprezentujące każde pole tabeli lub kwerendy można dodać członków danych.Ten mechanizm "wiązanie statyczne" jest proste, ale nie może być metodą pobierania/aktualizacja danych z wyboru dla wszystkich aplikacji.DXF pobiera każdego pola związanego każdorazowo, gdy zmienia się rekordem bieżącym.W wypadku opracowywania aplikacji wymagające pod względem wydajności, które nie wymagają pobierania wszystkich pól po zmianie waluty "wiązanie dynamiczne" via CDaoRecordset::GetFieldValue i CDaoRecordset::SetFieldValue może być wybór metody dostępu.
[!UWAGA]
DXF i wiązanie dynamiczne nie wykluczają, więc może być używany hybrydowy stosowania statycznych i dynamicznych wiązania.
Przykład 1 — Użycie tylko wymiany pól rekordów DAO
(zakłada CDaoRecordset — klasy CMySet już otwarty)
// Add a new record to the customers table
myset.AddNew();
myset.m_strCustID = _T("MSFT");
myset.m_strCustName = _T("Microsoft");
myset.Update();
Przykład 2 — Użycie tylko dynamiczne wiązanie
(zakłada za pomocą CDaoRecordset klasy, rs, a jest już otwarty)
// Add a new record to the customers table
COleVariant varFieldValue1 ( _T("MSFT"), VT_BSTRT );
//Note: VT_BSTRT flags string type as ANSI, instead of UNICODE default
COleVariant varFieldValue2 (_T("Microsoft"), VT_BSTRT );
rs.AddNew();
rs.SetFieldValue(_T("Customer_ID"), varFieldValue1);
rs.SetFieldValue(_T("Customer_Name"), varFieldValue2);
rs.Update();
Przykład 3 — Użyj z DAO rekord pola wymiany i wiązanie dynamiczne
(zakłada przeglądania danych pracownika z CDaoRecordset-klasy emp)
// Get the employee's data so that it can be displayed
emp.MoveNext();
// If user wants to see employee's photograph,
// fetch it
COleVariant varPhoto;
if (bSeePicture)
emp.GetFieldValue(_T("photo"), varPhoto);
// Display the data
PopUpEmployeeData(emp.m_strFirstName,
emp.m_strLastName, varPhoto);
Jak działa DXF
Mechanizm DXF działa w sposób podobny do mechanizmu wymiany (RFX) pole rekordu używany przez klas MFC ODBC.Zasad DFX i RFX są takie same, ale istnieje wiele różnic wewnętrznych.Projekt funkcji DXF był taki, że praktycznie cały kod jest udostępniony przez poszczególne procedury DXF.W tylko najwyższy poziom DXF ma kilka rzeczy.
DXF konstrukcji SQL Wybierz SQL i klauzuli Parametry klauzula, jeśli to konieczne.
DXF konstrukcje struktury powiązanie używane przez firmy DAO GetRows funkcja (więcej informacji w dalszej części artykułu).
DXF zarządza bufor danych używane do wykrywania pól brudne (jeśli podwójne buforowanie jest używana)
DXF zarządza wartości NULL i DIRTY stan tablic i ustawia wartości w razie potrzeby na aktualizacje.
Istotą DXF mechanizm jest CDaoRecordset pochodnych klasy DoFieldExchange funkcji.Ta funkcja wywołuje wywołania poszczególnych funkcji DXF typu odpowiedniej czynności.Przed wywołaniem funkcji DoFieldExchange funkcje wewnętrzne MFC Ustaw typ operacji.Na poniższej liście przedstawiono różne typy operacji i krótki opis.
Operacja |
Opis |
---|---|
AddToParameterList |
Buduje PARAMETRACH klauzuli |
AddToSelectList |
Klauzula SELECT buduje |
BindField |
Konfiguruje struktury wiązanie |
BindParam |
Ustawia wartości parametrów |
Korekty |
Ustawia stan NULL |
AllocCache |
Przydziela pamięć podręczną dla wyboru dirty |
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 |
Ustawia w polu Stan & wartość NULL |
MarkForAddNew |
Znaki pola dirty Jeśli nie PSEUDO NULL |
MarkForEdit |
Znaki pola if brudne nie odpowiadają pamięci podręcznej |
SetDirtyField |
Ustawia w polu wartości oznaczony jako zanieczyszczony |
W następnej sekcji, każdej operacji zostaną wyjaśnione bardziej szczegółowo do DFX_Text.
Najważniejszą cechą zrozumieć o procesu wymiany pól rekordów DAO jest, że korzysta z GetRows funkcja CDaoRecordset obiektu.DAO GetRows funkcji można pracować na kilka sposobów.Ta uwaga techniczna tylko zwięźle opisano GetRows jak to jest poza zakresem niniejszej noty techniczne.
DAO GetRows można pracować na kilka sposobów.
To może pobrać wiele rekordów i wiele pól danych, w tym samym czasie.Pozwala to uzyskać szybszy dostęp do danych z komplikacji radzenia sobie ze strukturą dużych danych i odpowiednie przesunięcia do każdego pola, jak i dla każdego rekordu danych w strukturze.MFC nie korzystać z tego rekordu wielu mechanizm pobierania.
Inny sposób GetRows można pracy jest umożliwienie programistom określić adresy wiązania dla każdego pola dla jednego rekordu danych pobrane dane.
DAO będą również "Oddzwonić" do rozmówcy dla kolumn o zmiennej długości w celu umożliwienia wywołujący przydzielić pamięci.Funkcja ta druga ma zaletę minimalizację liczby kopii danych, a także umożliwiając bezpośrednie przechowywanie danych do elementy klasy ( CDaoRecordset klasy).Mechanizm ten drugi jest metoda MFC używa do powiązania danych członków w CDaoRecordset klasy pochodne.
Co robi rutynowych niestandardowe DXF
To wynika z tej dyskusji, które najważniejszych działania realizowane w dowolnej funkcji DXF musi być możliwość skonfigurowania struktur danych wymagany do pomyślnego wywołania GetRows.Istnieje szereg funkcji DXF musi obsługiwać również inne operacje, ale żaden jako ważne lub złożone jak poprawnie przygotowanie do GetRows zadzwonić.
Użycie DXF jest opisane w dokumentacji online.Zasadniczo istnieją dwa wymogi.Po pierwsze, należy dodać członków do CDaoRecordset klasy dla każdego pola związanego i parametr.Po tym CDaoRecordset::DoFieldExchange powinny zostać zastąpione.Należy zauważyć, że typ danych członka jest ważny.To powinny odpowiadać dane z pola w bazie danych lub przynajmniej być konwertowalna na ten typ..Na przykład pole liczbowe w bazie danych, takie jak liczba całkowita długa, można zawsze konwertowane na tekst i powiązane z CString Państwa, ale pole tekstowe w bazie danych, niekoniecznie mogą być konwertowane na numeryczną reprezentację, takie jak liczba całkowita długa i powiązane z członkiem liczba całkowita długa.DAO i aparat bazy danych Microsoft Jet są odpowiedzialne za konwersji (zamiast MFC).
Szczegóły DFX_Text
Jak już wspomniano, jest najlepszym sposobem, aby wyjaśnić, jak działa DXF, do pracy ze względu na przykład.W tym celu przechodzenia przez wewnętrzne z DFX_Text powinno działać dość dobrze w celu uzyskania przynajmniej w podstawowym zakresie DXF.
AddToParameterList
Ta operacja tworzy SQL Parametry klauzula ("Parameters <param name>, <param type> ... ;") wymagane przez aparat Jet.Każdy parametr jest o nazwie i wpisane (jak określono w wywołaniu RFX).Zobacz opis funkcji CDaoFieldExchange::AppendParamType funkcji, aby wyświetlić nazwy poszczególnych typów.W odniesieniu do DFX_Text, typ używany jest text.AddToSelectList
Buduje SQL Wybierz klauzuli.Jest to dość prosty jak nazwa kolumny, określona przez wywołanie DXF jest po prostu dołączana ("SELECT <column name>, ...").BindField
Najbardziej złożonych operacji.Jak już wspomniano, jest to, gdzie struktura wiązania DAO używana przez GetRows jest skonfigurowany.Jak widać z kodu w DFX_Text typy informacji w strukturze użytej DAO (DAO_CHAR lub DAO_WCHAR w odniesieniu do DFX_Text).Dodatkowo rodzaj oprawy używany jest również ustawić.We wcześniejszej sekcji GetRows została opisana tylko na krótko, ale to było wystarczające do wyjaśnienia typ powiązanie używane przez MFC jest zawsze powiązanie bezpośredniego adresu (DAOBINDING_DIRECT).Dodatkowo dla powiązań kolumn o zmiennej długości (takich jak DFX_Text) jest używane wiązanie wywołania zwrotnego, tak aby MFC można kontrolować alokacji pamięci i określić adres odpowiednią długość.Oznacza to, że MFC zawsze możesz powiedzieć DAO ", gdzie" umieścić dane, umożliwiając powiązanie bezpośrednio do zmienne składowe.Pozostałe struktury jest wypełniane rzeczy, jak adres funkcji wywołania zwrotnego alokacji pamięci i rodzaj powiązań kolumn (wiążący przez nazwę kolumny).BindParam
Jest to prostych operacji, która wywołuje SetParamValue z wartości parametru określonej w parametr elementów członkowskich.Korekty
Wypełnia wartości NULL stanu dla każdego pola.SetFieldNull
Ta operacja oznacza tylko stan każdego pola jako wartości NULL i ustawia wartość zmiennej członka do PSEUDO_NULL.SetDirtyField
Wywołania SetFieldValue dla każdego pola oznaczony jako zmieniony.
Pozostałe operacje zajmować tylko przy użyciu pamięci podręcznej danych.Pamięć podręczna danych jest dodatkowy bufor danych w bieżącym rekordzie, używanym do uproszczenia pewne rzeczy.Na przykład "brudne" pól mogą być automatycznie wykryte.Zgodnie z opisem w dokumentacji online to można wyłączyć całkowicie lub na szczeblu terytorialnym.Implementacja buforu wykorzystuje mapy.To mapowanie jest używany do dopasowywania się dynamicznie przydzielonego kopii danych o adresie pole "związane" (lub CDaoRecordset pochodnych członka danych).
AllocCache
Dynamicznie przydziela wartość pola buforowany i dodaje go do mapy.FreeCache
Usuwa wartość pola buforowany i usuwa go z mapy.StoreField
Bieżąca wartość pola zostanie skopiowana do pamięci podręcznej danych.LoadField
Kopiuje wartość buforowana stał się członkiem pola.MarkForAddNew
Sprawdza, czy wartość bieżącego pola jest non -wartości NULL i oznacza je zanieczyszczenia w razie potrzeby.MarkForEdit
Porównuje bieżącą wartość pola z pamięci podręcznej danych i znaki dirty, jeśli to konieczne.
Porada |
---|
Model z niestandardowych procedur DXF na istniejących procedur DXF dla typów danych standardowych. |