Udostępnij za pośrednictwem


Zestaw rekordów: jak działają funkcje AddNew, Edit i Delete (ODBC)

Ten temat dotyczy klas MFC ODBC.

W tym temacie wyjaśniono, jak AddNewdziałają funkcje CRecordset składowe klasy , Editi 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 AddNewzestawu 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 AddNewfunkcji 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 ::SQLSetPosprogramowi 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:

    1. Jeśli żadne zmiany nie zostaną wykryte, Update nic nie robi i zwraca wartość 0.

    2. 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 );
      
    3. 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.

    4. 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łaj SetFieldDirty 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ć SetFieldNullmetodę , 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 ::SQLSetPosdodane 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 Editzestawu 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 Editrekordu 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 Editwywoł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 Updatezestawu rekordów nie może być pusty, a bieżący rekord nie może zostać usunięty. IsBOF, IsEOFi 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 ::SQLSetPossterownik porównuje bufor edycji z odpowiednim rekordem na serwerze, aktualizując rekord na serwerze, jeśli te dwa są różne. Program ::SQLSetPosMFC 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:

    1. Jeśli nie nastąpiły żadne zmiany, Update nic nie robi i zwraca wartość 0.

    2. Jeśli istnieją zmiany, Update tworzy instrukcję SQL UPDATE . Kolumny wymienione w instrukcji UPDATE są oparte na zmienionych elementach członkowskich danych pól.

    3. 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ę.

    4. W przeciwieństwie do procesu dla AddNewprogramu Edit 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 metody Update.

    Napiwek

    Jeśli wywołasz AddNew funkcję lub Edit po wywołaniu jej wcześniej, ale przed wywołaniem Update, bufor edycji zostanie odświeżony z zapisanym rekordem, zastępując nowy lub edytowany rekord w toku. To zachowanie umożliwia przerwanie AddNew elementu lub Edit i rozpoczęcie nowego: jeśli ustalisz, że rekord w toku jest uszkodzony, po prostu wywołaj Edit lub AddNew 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 EditDelete , nie wymaga zgodnego wywołania metody .Update

Jako warunek wstępny do wywoływania Deletezestawu rekordów musi być aktualizowalny i musi znajdować się w rekordzie. Funkcje składowe CanUpdate, IsBOF, IsEOFi 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:

    1. Bieżący rekord w buforze edycji nie jest kopią zapasową jak w pliku AddNew i Edit.

    2. Delete tworzy instrukcję SQL DELETE , która usuwa rekord.

      Bieżący rekord w buforze edycji nie jest przechowywany tak jak w AddNew plikach i Edit.

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

    4. 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 metody Edit.

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)