Udostępnij za pośrednictwem


Hierarchiczna aktualizacja w programie .NET Framework

Uwaga

Zestawy danych 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. Są one szczególnie przydatne w przypadku aplikacji, które umożliwiają użytkownikom modyfikowanie danych i utrwalanie zmian z powrotem w bazie danych. Mimo że zestawy danych okazały się bardzo udaną technologią, zalecamy, aby nowe aplikacje platformy .NET używały platformy Entity Framework Core. Program Entity Framework zapewnia bardziej naturalny sposób pracy z danymi tabelarycznymi jako modelami obiektów i ma prostszy 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 elementu do TableAdapterManager zarządzania elementami TableAdapterw typowym zestawie danych. 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, zobacz sekcję TableAdapterManager TableAdapterManager Reference ( Dokumentacja klasy TableAdapterManager) tabeli 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 efekcie.

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 wstawki, a następnie aktualizacje, a następnie usuwanie. 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

Ważne jest, aby zrozumieć, że kolejność aktualizacji jest włącznie. 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 wycofywanie zwraca aplikację do stanu pierwotnego.

Czasami jednak możesz chcieć przywrócić zestaw danych z kopii zapasowej. Jeden z przykładów może wystąpić, gdy używasz wartości przyrostu automatycznego. 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 jest to problem, TableAdapterManager właściwość udostępnia właściwość zastępującą BackupDataSetBeforeUpdate istniejący zestaw danych kopią zapasową kopią zapasową, jeśli transakcja zakończy się niepowodzeniem.

Uwaga

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 oryginalny zestaw danych lub wykracza poza zakres, gdy tylko TableAdapterManager.UpdateAll metoda 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 BindingNavigator przycisku Zapisz, aby zapisać dane z zestawu danych z powrotem do bazy danych (TableAdapterManager.UpdateAllmetoda).

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

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 przycisku Zapisz powinien wyglądać podobnie do następującego:

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

Oprócz zatwierdzania zmian w powiązanej tabeli podrzędnej przed zapisaniem danych w bazie danych może być również konieczne zatwierdzenie nowo utworzonych rekordów nadrzędnych przed dodaniem nowych rekordów podrzędnych do zestawu danych. Innymi słowy, może być konieczne 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

Niezależnie od tego, czy musisz zatwierdzić nowe rekordy nadrzędne, zależy od typu kontrolki używanej 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 OrdersBindingSource.AddingNew zdarzenia.

    • 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 projektowej strony Formularz systemu Windows lub 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:

Element członkowski opis
UpdateAll metoda Zapisuje wszystkie dane ze wszystkich tabel danych.
BackUpDataSetBeforeUpdate własność Określa, czy należy utworzyć kopię zapasową zestawu danych przed wykonaniem TableAdapterManager.UpdateAll metody. Boolowski.
właściwość tableName TableAdapter Reprezentuje element TableAdapter. Wygenerowany TableAdapterManager element zawiera właściwość dla każdej TableAdapter zarządzanej przez nią właściwości. Na przykład zestaw danych z tabelą Customers (Klienci) i Orders (Zamówienia) jest generowany za pomocą właściwości TableAdapterManager i OrdersTableAdapter .CustomersTableAdapter
UpdateOrder własność Określa kolejność poszczególnych poleceń wstawiania, aktualizowania i usuwania. Ustaw tę wartość na jedną z wartości w wyliczenie TableAdapterManager.UpdateOrderOption .

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