Zestaw rekordów: jak działają funkcje AddNew, Edit i Delete (ODBC)
Ten temat dotyczy klas MFC ODBC.
W tym temacie wyjaśniono, jak AddNew
działają funkcje CRecordset
składowe klasy , Edit
i Delete
. Omawiane tematy to m.in.:
Uwaga
Ten temat dotyczy obiektów pochodnych, CRecordset
z których pobieranie wierszy zbiorczych nie zostało zaimplementowane. Jeśli używasz zbiorczego pobierania wierszy, zobacz Zestaw rekordów: pobieranie rekordów zbiorczo (ODBC).
Jako dodatek warto przeczytać artykuł Wymiana pól rekordów: Jak działa RFX, która opisuje odpowiednią rolę RFX w operacjach aktualizacji.
Dodawanie rekordu
Dodanie nowego rekordu do zestawu rekordów obejmuje wywołanie funkcji AddNew składowej zestawu rekordów, ustawienie wartości elementów członkowskich pola nowego rekordu i wywołanie funkcji elementu członkowskiego Update w celu zapisania rekordu w źródle danych.
Jako warunek wstępny do wywoływania AddNew
zestawu rekordów nie może być otwarty jako tylko do odczytu. Funkcje CanUpdate
składowe i CanAppend
umożliwiają określenie tych warunków.
Po wywołaniu metody AddNew
:
Rekord w buforze edycji jest przechowywany, więc jego zawartość można przywrócić, jeśli operacja zostanie anulowana.
Elementy członkowskie danych pól są oflagowane, aby można było wykryć zmiany w nich później. Składowe danych pola są również oznaczone jako czyste (bez zmian) i ustawione na wartość Null.
Po wywołaniu AddNew
funkcji bufor edycji reprezentuje nowy, pusty rekord gotowy do wypełnienia wartościami. W tym celu należy ręcznie ustawić wartości, przypisując je do nich. Zamiast określać rzeczywistą wartość danych dla pola, możesz wywołać SetFieldNull
metodę , aby określić wartość Null.
Aby zatwierdzić zmiany, wywołaj metodę Update
. Po wywołaniu Update
nowego rekordu:
Jeśli sterownik ODBC obsługuje funkcję interfejsu
::SQLSetPos
API ODBC, MFC używa funkcji do dodawania rekordu w źródle danych. Dzięki::SQLSetPos
programowi MFC można wydajniej dodać rekord, ponieważ nie musi konstruować i przetwarzać instrukcji SQL.Jeśli
::SQLSetPos
nie można go użyć, MFC wykonuje następujące czynności:Jeśli żadne zmiany nie zostaną wykryte,
Update
nic nie robi i zwraca wartość 0.Jeśli istnieją zmiany,
Update
tworzy instrukcję SQL INSERT . Kolumny reprezentowane przez wszystkie zanieczyszczone składowe danych pól są wyświetlane w instrukcji INSERT . Aby wymusić dołączenie kolumny, wywołaj funkcję składową SetFieldDirty :SetFieldDirty( &m_dataMember, TRUE );
Update
zatwierdza nowy rekord — instrukcja INSERT jest wykonywana, a rekord jest zatwierdzany w tabeli w źródle danych (a zestaw rekordów, jeśli nie migawka), chyba że transakcja jest w toku.Przechowywany rekord jest przywracany do buforu edycji. Rekord, który był bieżący przed
AddNew
wywołaniem, jest ponownie obecny niezależnie od tego, czy instrukcja INSERT została pomyślnie wykonana.
Napiwek
Aby uzyskać pełną kontrolę nad nowym rekordem, wykonaj następujące podejście: ustaw wartości wszystkich pól, które będą miały wartości, a następnie jawnie ustaw wszystkie pola, które pozostaną puste, wywołując
SetFieldNull
wskaźnik do pola i parametr TRUE (wartość domyślna). Jeśli chcesz upewnić się, że pole nie jest zapisywane w źródle danych, wywołajSetFieldDirty
wskaźnik ze wskaźnikiem do pola i parametru FALSE i nie modyfikuj wartości pola. Aby określić, czy pole może mieć wartość Null, wywołaj metodęIsFieldNullable
.Napiwek
Aby wykryć, kiedy elementy członkowskie danych zestawu rekordów zmieniają wartość, MFC używa PSEUDO_NULL wartości odpowiedniej dla każdego typu danych, który można przechowywać w zestawie rekordów. Jeśli musisz jawnie ustawić pole na wartość PSEUDO_NULL, a pole ma już być oznaczone wartością Null, należy również wywołać
SetFieldNull
metodę , przekazując adres pola w pierwszym parametrze i FALSE w drugim parametrze.
Widoczność dodanych rekordów
Kiedy jest widoczny dodany rekord do zestawu rekordów? Dodane rekordy czasami są wyświetlane, a czasami nie są widoczne, w zależności od dwóch elementów:
Co twój kierowca jest w stanie.
Z czego mogą korzystać platformy.
Jeśli sterownik ODBC obsługuje funkcję interfejsu ::SQLSetPos
API ODBC, MFC używa funkcji do dodawania rekordów. W programie ::SQLSetPos
dodane rekordy są widoczne dla dowolnego zestawu rekordów MFC, które można aktualizować. Bez obsługi funkcji dodane rekordy nie są widoczne i należy wywołać Requery
metodę , aby je wyświetlić. Użycie ::SQLSetPos
jest również bardziej wydajne.
Edytowanie istniejącego rekordu
Edytowanie istniejącego rekordu w zestawie rekordów polega na przewinięciu do rekordu, wywołaniu funkcji edytuj składowej zestawu rekordów, ustawieniu wartości elementów członkowskich pól nowego rekordu i wywołaniu funkcji elementu członkowskiego Update w celu zapisania zmienionego rekordu w źródle danych.
Jako warunek wstępny do wywoływania Edit
zestawu rekordów musi być aktualizowalny i na rekordzie. Funkcje CanUpdate
składowe i IsDeleted
umożliwiają określenie tych warunków. Bieżący rekord nie może również zostać usunięty i w zestawie rekordów muszą znajdować się rekordy (zarówno, jak IsBOF
i IsEOF
zwracane 0).
Podczas wywoływania Edit
rekordu w buforze edycji (bieżący rekord) jest przechowywany. Wartości przechowywanego rekordu są później używane do wykrywania, czy jakiekolwiek pola uległy zmianie.
Po wywołaniu Edit
wywołania bufor edycji nadal reprezentuje bieżący rekord, ale jest teraz gotowy do akceptowania zmian w elementach członkowskich danych pól. Aby zmienić rekord, należy ręcznie ustawić wartości wszystkich elementów członkowskich danych pól, które chcesz edytować. Zamiast określać rzeczywistą wartość danych dla pola, możesz wywołać SetFieldNull
metodę , aby określić wartość Null. Aby zatwierdzić zmiany, wywołaj metodę Update
.
Napiwek
Aby wyjść z AddNew
trybu lub Edit
, wywołaj metodę Move
przy użyciu parametru AFX_MOVE_REFRESH.
Jako warunek wstępny do wywoływania Update
zestawu rekordów nie może być pusty, a bieżący rekord nie może zostać usunięty. IsBOF
, IsEOF
i IsDeleted
wszystkie powinny zwrócić wartość 0.
Po wywołaniu Update
edytowanego rekordu:
Jeśli sterownik ODBC obsługuje funkcję interfejsu
::SQLSetPos
API ODBC, MFC używa funkcji do aktualizowania rekordu w źródle danych. W programie::SQLSetPos
sterownik porównuje bufor edycji z odpowiednim rekordem na serwerze, aktualizując rekord na serwerze, jeśli te dwa są różne. Program::SQLSetPos
MFC może wydajniej aktualizować rekord, ponieważ nie musi tworzyć i przetwarzać instrukcji SQL.- lub -
Jeśli
::SQLSetPos
nie można go użyć, MFC wykonuje następujące czynności:Jeśli nie nastąpiły żadne zmiany,
Update
nic nie robi i zwraca wartość 0.Jeśli istnieją zmiany,
Update
tworzy instrukcję SQL UPDATE . Kolumny wymienione w instrukcji UPDATE są oparte na zmienionych elementach członkowskich danych pól.Update
zatwierdza zmiany — wykonuje instrukcję UPDATE , a rekord jest zmieniany w źródle danych, ale nie jest zatwierdzany, jeśli transakcja jest w toku (zobacz Transakcja: wykonywanie transakcji w zestawie rekordów (ODBC), aby uzyskać informacje o tym, jak transakcja wpływa na aktualizację. OdBC przechowuje kopię rekordu, co również zmienia się.W przeciwieństwie do procesu dla
AddNew
programuEdit
proces nie przywraca przechowywanego rekordu. Edytowany rekord pozostaje w miejscu jako bieżący rekord.
Uwaga
Gdy przygotowujesz się do aktualizacji zestawu rekordów przez wywołanie metody
Update
, upewnij się, że zestaw rekordów zawiera wszystkie kolumny tworzące klucz podstawowy tabeli (lub wszystkie kolumny dowolnego unikatowego indeksu w tabeli lub wystarczającą liczbę kolumn, aby jednoznacznie zidentyfikować wiersz). W niektórych przypadkach struktura może używać tylko kolumn wybranych w zestawie rekordów, aby zidentyfikować rekord w tabeli do zaktualizowania. Bez wszystkich niezbędnych kolumn wiele rekordów może zostać zaktualizowanych w tabeli. W takim przypadku struktura zgłasza wyjątki podczas wywoływania metodyUpdate
.Napiwek
Jeśli wywołasz
AddNew
funkcję lubEdit
po wywołaniu jej wcześniej, ale przed wywołaniemUpdate
, bufor edycji zostanie odświeżony z zapisanym rekordem, zastępując nowy lub edytowany rekord w toku. To zachowanie umożliwia przerwanieAddNew
elementu lubEdit
i rozpoczęcie nowego: jeśli ustalisz, że rekord w toku jest uszkodzony, po prostu wywołajEdit
lubAddNew
ponownie.
Usuwanie rekordu
Usunięcie rekordu z zestawu rekordów obejmuje przewinięcie do rekordu i wywołanie funkcji elementu członkowskiego Delete zestawu rekordów. W przeciwieństwie do AddNew
metod i Edit
Delete
, nie wymaga zgodnego wywołania metody .Update
Jako warunek wstępny do wywoływania Delete
zestawu rekordów musi być aktualizowalny i musi znajdować się w rekordzie. Funkcje składowe CanUpdate
, IsBOF
, IsEOF
i IsDeleted
umożliwiają określenie tych warunków.
Po wywołaniu metody Delete
:
Jeśli sterownik ODBC obsługuje funkcję interfejsu
::SQLSetPos
API ODBC, MFC używa funkcji do usuwania rekordu w źródle danych. Użycie::SQLSetPos
jest zwykle bardziej wydajne niż użycie języka SQL.- lub -
Jeśli
::SQLSetPos
nie można go użyć, MFC wykonuje następujące czynności:Bieżący rekord w buforze edycji nie jest kopią zapasową jak w pliku
AddNew
iEdit
.Delete
tworzy instrukcję SQL DELETE , która usuwa rekord.Bieżący rekord w buforze edycji nie jest przechowywany tak jak w
AddNew
plikach iEdit
.Delete
zatwierdza usunięcie — wykonuje instrukcję DELETE . Rekord jest oznaczony jako usunięty w źródle danych i, jeśli rekord jest migawką, w odBC.Usunięte wartości rekordu są nadal w elementach członkowskich danych pola zestawu rekordów, ale składowe danych pola są oznaczone wartością Null, a funkcja składowa zestawu
IsDeleted
rekordów zwraca wartość niezerową.
Uwaga
Po usunięciu rekordu należy przewinąć do innego rekordu, aby ponownie wypełnić bufor edycji danymi nowego rekordu. Jest to błąd podczas ponownego wywołania
Delete
metody lub wywołania metodyEdit
.
Aby uzyskać informacje na temat instrukcji SQL używanych w operacjach aktualizacji, zobacz SQL.
Zobacz też
Zestaw rekordów (ODBC)
Zestaw rekordów: więcej informacji o aktualizacjach (ODBC)
Wymiana pól rekordów (RFX)