Udostępnij przez


Hierarchiczna aktualizacja w programie .NET Framework

Uwaga / Notatka

Klasy DataSet i powiązane klasy to starsze technologie .NET Framework z początku 2000 roku, które umożliwiają aplikacjom pracę z danymi w pamięci, gdy aplikacje są odłączone od bazy danych. Technologie te są szczególnie przydatne w przypadku aplikacji, które umożliwiają użytkownikom modyfikowanie danych i utrwalanie zmian w bazie danych. Mimo że zestawy danych są sprawdzoną pomyślną technologią, zalecaną metodą dla nowych aplikacji platformy .NET jest użycie platformy Entity Framework Core. Program Entity Framework zapewnia bardziej naturalny sposób pracy z danymi tabelarycznymi jako modelami obiektów i ma bardziej prosty interfejs programowania.

Aktualizacja hierarchiczna odnosi się do procesu zapisywania zaktualizowanych danych (z zestawu danych z co najmniej dwiema powiązanymi tabelami) z powrotem do bazy danych przy zachowaniu reguł integralności referencyjnej. Integralność referencyjna odnosi się do reguł spójności udostępnianych przez ograniczenia w bazie danych, które kontrolują zachowanie wstawiania, aktualizowania i usuwania powiązanych rekordów. Na przykład jest to integralność referencyjna, która wymusza utworzenie rekordu klienta przed zezwoleniem na tworzenie zamówień dla tego klienta. Aby uzyskać więcej informacji na temat relacji w zestawach danych, zobacz Relacje w zestawach danych.

Funkcja aktualizacji hierarchicznej używa TableAdapterManager do zarządzania TableAdapterami w zestawie danych o określonym typie. Składnik TableAdapterManager jest klasą wygenerowaną przez program Visual Studio, a nie typem platformy .NET. Po przeciągnięciu tabeli z okna Źródła danych do formularza systemu Windows lub strony WPF program Visual Studio dodaje zmienną typu TableAdapterManager do formularza lub strony i zobaczysz ją w projektancie na pasku składników. Aby uzyskać szczegółowe informacje o klasie TableAdapterManager, zobacz sekcję TableAdapterManager Reference w dokumentacji TableAdapters.

Domyślnie zestaw danych traktuje powiązane tabele jako "tylko relacje", co oznacza, że nie wymusza ograniczeń klucza obcego. To ustawienie można zmodyfikować w czasie projektowania przy użyciu Projektanta zestawów danych. Wybierz linię relacji między dwiema tabelami, aby wyświetlić okno dialogowe Relacja . Wprowadzone tutaj zmiany określają, jak TableAdapterManager zachowuje się podczas wysyłania zmian w powiązanych tabelach z powrotem do bazy danych.

Włączanie aktualizacji hierarchicznej w zestawie danych

Domyślnie aktualizacja hierarchiczna jest włączona dla wszystkich nowych zestawów danych, które są dodawane lub tworzone w projekcie. Włącz lub wyłącz aktualizację hierarchiczną, ustawiając właściwość Hierarchiczna aktualizacja typu zestawu danych w zestawie danych na Prawda lub Fałsz:

Ustawienie aktualizacji hierarchicznej

Tworzenie nowej relacji między tabelami

Aby utworzyć nową relację między dwiema tabelami, w Projektancie zestawów danych wybierz pasek tytułu każdej tabeli, a następnie kliknij prawym przyciskiem myszy i wybierz pozycję Dodaj relację.

Hierarchiczne menu dodawania relacji aktualizacji

Omówienie ograniczeń klucza obcego, kaskadowych aktualizacji i usuwania

Ważne jest, aby zrozumieć, jak ograniczenia klucza obcego i kaskadowe zachowanie w bazie danych są tworzone w wygenerowanym kodzie zestawu danych.

Domyślnie tabele danych w zestawie danych są generowane z relacjami (DataRelation), które są zgodne z relacjami w bazie danych. Jednak relacja w zestawie danych nie jest generowana jako ograniczenie klucza obcego. Parametr DataRelation jest skonfigurowany jako Tylko relacja bez UpdateRule lub DeleteRule w użyciu.

Domyślnie kaskadowe aktualizacje i kaskadowe usuwanie są wyłączone, nawet jeśli relacja bazy danych jest ustawiona z kaskadowymi aktualizacjami lub kaskadowymi usunięciami włączonymi. Na przykład utworzenie nowego klienta i nowego zamówienia, a następnie próba zapisania danych może spowodować konflikt z ograniczeniami klucza obcego zdefiniowanymi w bazie danych. Aby uzyskać więcej informacji, zobacz Wyłączanie ograniczeń podczas wypełniania zestawu danych.

Ustawianie kolejności wykonywania aktualizacji

Ustawienie kolejności wykonywania aktualizacji określa kolejność poszczególnych wstawiania, aktualizacji i usuwania wymaganych do zapisania wszystkich zmodyfikowanych danych we wszystkich tabelach zestawu danych. Po włączeniu aktualizacji hierarchicznej najpierw są wykonywane wstawienia, następnie aktualizacje, a potem usunięcia. Element TableAdapterManager udostępnia UpdateOrder właściwość, którą można ustawić, aby najpierw wykonywać aktualizacje, a następnie wstawiać, a następnie usuwać.

Uwaga / Notatka

Ważne jest, aby zrozumieć, że kolejność aktualizacji jest wszechobejmująca. Oznacza to, że podczas wykonywania aktualizacji operacje wstawiania i usuwania są wykonywane dla wszystkich tabel w zestawie danych.

Aby ustawić UpdateOrder właściwość, po przeciągnięciu elementów z okna Źródła danych na formularz wybierz TableAdapterManager element na pasku składników, a następnie ustaw UpdateOrder właściwość w oknie Właściwości .

Tworzenie kopii zapasowej zestawu danych przed wykonaniem aktualizacji hierarchicznej

Podczas zapisywania danych (wywołując metodę TableAdapterManager.UpdateAll() ), TableAdapterManager próbuje zaktualizować dane dla każdej tabeli w jednej transakcji. Jeśli jakakolwiek część aktualizacji dowolnej tabeli zakończy się niepowodzeniem, cała transakcja zostanie wycofana. W większości sytuacji wycofanie zwraca aplikację do stanu pierwotnego.

Czasami jednak możesz chcieć przywrócić zestaw danych z kopii zapasowej. Jeden z takich przypadków może wystąpić, gdy używasz wartości autoinkrementacji. Jeśli na przykład operacja zapisywania nie powiedzie się, wartości przyrostu automatycznego nie zostaną zresetowane w zestawie danych, a zestaw danych będzie nadal tworzyć wartości automatycznego zwiększania. Spowoduje to pozostawienie luki w numerowaniu, które może nie być akceptowalne w aplikacji. W sytuacjach, gdy pojawia się ten problem, TableAdapterManager udostępnia właściwość BackupDataSetBeforeUpdate, która zastępuje istniejący zestaw danych kopią zapasową, jeśli transakcja zakończy się niepowodzeniem.

Uwaga / Notatka

Kopia zapasowa jest tylko w pamięci, gdy metoda jest uruchomiona TableAdapterManager.UpdateAll . W związku z tym nie ma programowego dostępu do tego zestawu danych kopii zapasowej, ponieważ zastępuje on oryginalny zestaw danych lub opuszcza zakres, gdy tylko metoda TableAdapterManager.UpdateAll zakończy działanie.

Modyfikowanie wygenerowanego kodu zapisu w celu przeprowadzenia aktualizacji hierarchicznej

Zapisz zmiany z powiązanych tabel danych w zestawie danych do bazy danych, wywołując TableAdapterManager.UpdateAll metodę i przekazując nazwę zestawu danych zawierającego powiązane tabele. Na przykład uruchom metodę TableAdapterManager.UpdateAll(NorthwindDataset) , aby wysyłać aktualizacje ze wszystkich tabel w elemecie NorthwindDataset do bazy danych zaplecza.

Po usunięciu elementów z okna Źródła danych kod zostanie automatycznie dodany do Form_Load zdarzenia, aby wypełnić każdą tabelę ( TableAdapter.Fill metody). Kod jest również dodawany do zdarzenia kliknięcia przycisku ZapiszBindingNavigator, aby zapisać dane z zestawu danych z powrotem do bazy danych (metoda TableAdapterManager.UpdateAll).

Wygenerowany kod zapisu zawiera również wiersz kodu, który wywołuje metodę CustomersBindingSource.EndEdit . Mówiąc dokładniej, wywołuje metodę EndEdit pierwszego BindingSourceelementu dodanego do formularza. Innymi słowy ten kod jest generowany tylko dla pierwszej tabeli przeciągniętej z okna Źródła danych na formularz. Wywołanie EndEdit zatwierdza wszelkie zmiany, które są przetwarzane w dowolnych kontrolkach powiązanych z danymi, które są obecnie edytowane. W związku z tym jeśli kontrolka powiązana z danymi nadal ma fokus i klikniesz przycisk Zapisz , wszystkie oczekujące zmiany w tej kontrolce zostaną zatwierdzone przed rzeczywistym zapisaniem ( TableAdapterManager.UpdateAll metoda).

Uwaga / Notatka

Projektant zestawów danych dodaje BindingSource.EndEdit tylko kod dla pierwszej tabeli, która została porzucona w formularzu. W związku z tym należy dodać wiersz kodu, aby wywołać BindingSource.EndEdit metodę dla każdej powiązanej tabeli w formularzu. W tym przewodniku oznacza to, że musisz dodać wywołanie do OrdersBindingSource.EndEdit metody .

  1. Kliknij dwukrotnie przycisk Zapisz , BindingNavigator aby otworzyć formularz Form1 w Edytorze kodu.

  2. Dodaj wiersz kodu, aby wywołać OrdersBindingSource.EndEdit metodę po wierszu, który wywołuje metodę CustomersBindingSource.EndEdit . Kod w zdarzeniu kliknięcia przycisku Zapisz powinien wyglądać podobnie do następującego:

    this.Validate();
    this.customersBindingSource.EndEdit();
    this.ordersBindingSource.EndEdit();
    this.tableAdapterManager.UpdateAll(this.northwindDataSet);
    

Zanim zapiszesz dane w bazie danych, oprócz zatwierdzenia zmian w powiązanej tabeli podrzędnej, może być konieczne zatwierdzenie nowo utworzonych rekordów nadrzędnych, zanim dodasz nowe rekordy podrzędne do zestawu danych. Innymi słowy, konieczne może się okazać dodanie nowego rekordu nadrzędnego (Customer) do zestawu danych, zanim ograniczenia klucza obcego umożliwią dodanie nowych rekordów podrzędnych (Orders) do zestawu danych. W tym celu można użyć zdarzenia podrzędnego BindingSource.AddingNew .

Uwaga / Notatka

To, czy musisz zatwierdzić nowe rekordy nadrzędne, zależy od typu kontrolki, która jest używana do powiązania ze źródłem danych. W tym przewodniku użyjesz poszczególnych kontrolek do powiązania z tabelą nadrzędną. Wymaga to dodatkowego kodu do zatwierdzenia nowego rekordu nadrzędnego. Jeśli rekordy nadrzędne były wyświetlane w złożonej kontrolce powiązania, takiej jak DataGridView, to dodatkowe EndEdit wywołanie rekordu nadrzędnego nie byłoby konieczne. Dzieje się tak, ponieważ podstawowa funkcja powiązania danych kontrolki obsługuje zatwierdzanie nowych rekordów.

Aby dodać kod do zatwierdzania rekordów nadrzędnych w zestawie danych przed dodaniem nowych rekordów podrzędnych

  1. Utwórz procedurę obsługi zdarzeń dla zdarzenia OrdersBindingSource.AddingNew.

    • Otwórz plik Form1 w widoku projektu, wybierz pozycję OrdersBindingSource na pasku składników, wybierz pozycję Zdarzenia w oknie Właściwości , a następnie kliknij dwukrotnie zdarzenie DodawanieNowe .
  2. Dodaj wiersz kodu do procedury obsługi zdarzeń, która wywołuje metodę CustomersBindingSource.EndEdit . Kod w procedurze obsługi zdarzeń OrdersBindingSource_AddingNew powinien wyglądać podobnie do następującego:

    this.customersBindingSource.EndEdit();
    

Dokumentacja narzędzia TableAdapterManager

Domyślnie TableAdapterManager klasa jest generowana podczas tworzenia zestawu danych zawierającego powiązane tabele. Aby zapobiec generowaniu klasy, zmień wartość Hierarchical Update właściwości zestawu danych na false. Przeciągając tabelę, która ma relację, na powierzchnię projektową formularza Windows lub strony WPF, program Visual Studio deklaruje zmienną składową klasy. Jeśli nie używasz powiązania danych, musisz ręcznie zadeklarować zmienną.

Klasa TableAdapterManager nie jest typem platformy .NET. W związku z tym nie można go wyszukać w dokumentacji. Jest on tworzony w czasie projektowania w ramach procesu tworzenia zestawu danych.

Poniżej przedstawiono często używane metody i właściwości TableAdapterManager klasy:

Członek Opis
Metoda UpdateAll Zapisuje wszystkie dane ze wszystkich tabel danych.
BackUpDataSetBeforeUpdate własność Określa, czy należy utworzyć kopię zapasową zestawu danych przed wykonaniem metody TableAdapterManager.UpdateAll. Wartość logiczna.
właściwość tableNameTableAdapter Reprezentuje element TableAdapter. Wygenerowany TableAdapterManager zawiera właściwość dla każdej zarządzanej TableAdapter. Na przykład zestaw danych z tabelą Klienci (Customers) i Zamówienia (Orders) jest generowany z TableAdapterManager, która zawiera właściwości CustomersTableAdapter i OrdersTableAdapter.
UpdateOrder własność Określa kolejność poszczególnych poleceń wstawiania, aktualizowania i usuwania. Ustaw tę wartość na jedną z wartości w wyliczeń TableAdapterManager.UpdateOrderOption.

Domyślnie UpdateOrder jest ustawiony na InsertUpdateDelete. Oznacza to, że operacje wstawiania, a następnie aktualizacji, a następnie usuwania są wykonywane dla wszystkich tabel w zestawie danych.