Weryfikowanie danych w zestawach danych w aplikacjach .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.

Weryfikowanie danych to proces potwierdzania, że wartości wprowadzane do obiektów danych są zgodne z ograniczeniami w schemacie zestawu danych. Proces weryfikacji potwierdza również, że te wartości są następujące zgodnie z regułami, które zostały ustanowione dla aplikacji. Dobrym rozwiązaniem jest zweryfikowanie danych przed wysłaniem aktualizacji do bazowej bazy danych. Zmniejsza to błędy, a także potencjalną liczbę rund między aplikacją a bazą danych.

Możesz potwierdzić, że dane zapisywane w zestawie danych są prawidłowe, tworząc sprawdzanie poprawności w samym zestawie danych. Zestaw danych może sprawdzać dane niezależnie od tego, jak jest wykonywana aktualizacja — czy bezpośrednio przez kontrolki w formularzu, w składniku, czy w inny sposób. Ponieważ zestaw danych jest częścią aplikacji (w przeciwieństwie do zaplecza bazy danych), jest to logiczne miejsce do kompilowania weryfikacji specyficznej dla aplikacji.

Najlepszym miejscem do dodania walidacji do aplikacji jest częściowy plik klasy zestawu danych. W języku Visual Basic lub Visual C# otwórz zestaw danych Projektant i kliknij dwukrotnie kolumnę lub tabelę, dla której chcesz utworzyć walidację. Ta akcja powoduje otwarcie pliku kodu, w którym można utworzyć ColumnChanging program obsługi zdarzeń lub RowChanging .

private static void OnColumnChanging(object sender, DataColumnChangeEventArgs e)
{

}

Weryfikacja danych

Walidacja w zestawie danych jest realizowana w następujący sposób:

Kilka zdarzeń jest zgłaszanych przez DataTable obiekt, gdy zmiana występuje w rekordzie:

  • Zdarzenia ColumnChanging i ColumnChanged są wywoływane podczas i po każdej zmianie do pojedynczej kolumny. Zdarzenie ColumnChanging jest przydatne, gdy chcesz zweryfikować zmiany w określonych kolumnach. Informacje o proponowanej zmianie są przekazywane jako argument ze zdarzeniem.
  • Zdarzenia RowChanging i RowChanged są wywoływane podczas i po każdej zmianie w wierszu. Wydarzenie RowChanging jest bardziej ogólne. Wskazuje, że zmiana występuje gdzieś w wierszu, ale nie wiesz, która kolumna uległa zmianie.

Domyślnie każda zmiana kolumny powoduje wywołanie czterech zdarzeń. Pierwszy to zdarzenia ColumnChanging i ColumnChanged dla określonej kolumny, która jest zmieniana. Następnie znajdują się zdarzenia RowChanging i RowChanged . Jeśli w wierszu zostanie wprowadzonych wiele zmian, zdarzenia zostaną zgłoszone dla każdej zmiany.

Uwaga

Metoda wiersza BeginEdit danych wyłącza RowChanging zdarzenia i RowChanged po zmianie poszczególnych kolumn. W takim przypadku zdarzenie nie jest wywoływane do momentu EndEdit wywołania metody , gdy RowChanging zdarzenia i RowChanged są wywoływane tylko raz. Aby uzyskać więcej informacji, zobacz Wyłączanie ograniczeń podczas wypełniania zestawu danych.

Wybrane zdarzenie zależy od stopnia szczegółowości weryfikacji. Jeśli ważne jest, aby przechwycić błąd natychmiast po zmianie kolumny, weryfikacja kompilacji przy użyciu ColumnChanging zdarzenia. W przeciwnym razie użyj RowChanging zdarzenia, co może spowodować przechwycenie kilku błędów jednocześnie. Ponadto jeśli dane są ustrukturyzowane tak, aby wartość jednej kolumny została zweryfikowana na podstawie zawartości innej kolumny, przeprowadź walidację podczas RowChanging zdarzenia.

Po zaktualizowaniu rekordów obiekt zgłasza zdarzenia, DataTable na które można reagować w miarę występowania zmian i po wprowadzeniu zmian.

Jeśli aplikacja używa typizowanego zestawu danych, możesz utworzyć silnie typizowane programy obsługi zdarzeń. Spowoduje to dodanie czterech dodatkowych zdarzeń wpisanych, dla których można tworzyć programy obsługi: dataTableNameRowChanging, , dataTableNameRowChangeddataTableNameRowDeletingi dataTableNameRowDeleted. Te typizowane programy obsługi zdarzeń przekazują argument zawierający nazwy kolumn tabeli, które ułatwiają pisanie i odczytywanie kodu.

Zdarzenia aktualizacji danych

Wydarzenie opis
ColumnChanging Wartość w kolumnie jest zmieniana. Zdarzenie przekazuje wiersz i kolumnę do Ciebie wraz z proponowaną nową wartością.
ColumnChanged Wartość w kolumnie została zmieniona. Zdarzenie przekazuje wiersz i kolumnę do Ciebie wraz z proponowaną wartością.
RowChanging Zmiany wprowadzone w DataRow obiekcie mają zostać zatwierdzone z powrotem do zestawu danych. Jeśli metoda nie została wywołana BeginEdit , RowChanging zdarzenie jest zgłaszane dla każdej zmiany w kolumnie natychmiast po wywołaniu ColumnChanging zdarzenia. Jeśli wywołano BeginEdit metodę przed wprowadzeniem zmian, RowChanging zdarzenie jest zgłaszane tylko podczas wywoływania EndEdit metody.

Zdarzenie przekazuje wiersz do Ciebie wraz z wartością wskazującą typ akcji (zmiana, wstawianie itd.).
RowChanged Wiersz został zmieniony. Zdarzenie przekazuje wiersz do Ciebie wraz z wartością wskazującą typ akcji (zmiana, wstawianie itd.).
RowDeleting Wiersz jest usuwany. Zdarzenie przekazuje wiersz do Ciebie wraz z wartością wskazującą, jaki typ akcji (usuwanie) jest wykonywany.
RowDeleted Wiersz został usunięty. Zdarzenie przekazuje wiersz do Ciebie wraz z wartością wskazującą, jaki typ akcji (usuwanie) jest wykonywany.

Zdarzenia ColumnChanging, RowChangingi są RowDeleting wywoływane podczas procesu aktualizacji. Za pomocą tych zdarzeń można weryfikować dane lub wykonywać inne typy przetwarzania. Ponieważ aktualizacja jest przetwarzana podczas tych zdarzeń, można ją anulować, zgłaszając wyjątek, co uniemożliwia zakończenie aktualizacji.

RowChanged Zdarzenia ColumnChangedi RowDeleted to zdarzenia powiadomień, które są zgłaszane po pomyślnym zakończeniu aktualizacji. Te zdarzenia są przydatne, gdy chcesz podjąć dalsze działania na podstawie pomyślnej aktualizacji.

Weryfikowanie danych podczas zmian w kolumnie

Uwaga

Zestaw danych Projektant tworzy klasę częściową, w której można dodać logikę walidacji do zestawu danych. Zestaw danych wygenerowany przez projektanta nie usuwa ani nie zmienia żadnego kodu w klasie częściowej.

Dane można zweryfikować, gdy wartość w kolumnie danych ulegnie zmianie, odpowiadając na ColumnChanging zdarzenie. Po wyświetleniu tego zdarzenia przekazuje argument zdarzenia (ProposedValue), który zawiera wartość proponowaną dla bieżącej kolumny. Na podstawie zawartości e.ProposedValueelementu można wykonywać następujące czynności:

  • Zaakceptuj proponowaną wartość, nic nie robiąc.

  • Odrzuć proponowaną wartość, ustawiając błąd kolumny (SetColumnError) z programu obsługi zdarzeń zmieniającej kolumnę.

  • Opcjonalnie użyj kontrolki ErrorProvider , aby wyświetlić użytkownikowi komunikat o błędzie. Aby uzyskać więcej informacji, zobacz ErrorProvider component (Składnik ErrorProvider).

Podczas zdarzenia można również przeprowadzić walidację RowChanging .

Weryfikowanie danych podczas zmian wierszy

Możesz napisać kod, aby sprawdzić, czy każda kolumna, którą chcesz zweryfikować, zawiera dane spełniające wymagania aplikacji. Zrób to, ustawiając kolumnę, aby wskazać, że zawiera błąd, jeśli proponowana wartość jest niedopuszczalna. Poniższe przykłady ustawiają błąd kolumny, gdy kolumna Quantity ma wartość 0 lub mniejszą. Programy obsługi zdarzeń zmieniające wiersze powinny przypominać poniższe przykłady.

Aby zweryfikować dane po zmianie wiersza (Visual Basic)

  1. Otwórz zestaw danych w Projektant Zestaw danych. Aby uzyskać więcej informacji, zobacz Przewodnik: tworzenie zestawu danych w zestawie danych Projektant.

  2. Kliknij dwukrotnie pasek tytułu tabeli, którą chcesz zweryfikować. Ta akcja automatycznie tworzy procedurę RowChanging obsługi DataTable zdarzeń w pliku klasy częściowej zestawu danych.

    Napiwek

    Kliknij dwukrotnie po lewej stronie nazwy tabeli, aby utworzyć procedurę obsługi zdarzeń zmieniającą wiersz. Jeśli klikniesz dwukrotnie nazwę tabeli, możesz ją edytować.

    Private Sub Order_DetailsDataTable_Order_DetailsRowChanging(
        ByVal sender As System.Object, 
        ByVal e As Order_DetailsRowChangeEvent
      ) Handles Me.Order_DetailsRowChanging
    
        If CType(e.Row.Quantity, Short) <= 0 Then
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0")
        Else
            e.Row.SetColumnError("Quantity", "")
        End If
    End Sub
    

Aby zweryfikować dane po zmianie wiersza (C#)

  1. Otwórz zestaw danych w Projektant Zestaw danych. Aby uzyskać więcej informacji, zobacz Przewodnik: tworzenie zestawu danych w zestawie danych Projektant.

  2. Kliknij dwukrotnie pasek tytułu tabeli, którą chcesz zweryfikować. Ta akcja powoduje utworzenie pliku klasy częściowej dla elementu DataTable.

    Uwaga

    Zestaw danych Projektant nie tworzy automatycznie procedury obsługi zdarzeń dla RowChanging zdarzenia. Musisz utworzyć metodę do obsługi RowChanging zdarzenia i uruchomić kod, aby podłączyć zdarzenie w metodzie inicjowania tabeli.

  3. Skopiuj następujący kod do klasy częściowej:

    public override void EndInit()
    {
        base.EndInit();
        Order_DetailsRowChanging += TestRowChangeEvent;
    }
    
    public void TestRowChangeEvent(object sender, Order_DetailsRowChangeEvent e)
    {
        if ((short)e.Row.Quantity <= 0)
        {
            e.Row.SetColumnError("Quantity", "Quantity must be greater than 0");
        }
        else
        {
            e.Row.SetColumnError("Quantity", "");
        }
    }
    

Aby pobrać zmienione wiersze

Każdy wiersz w tabeli danych ma RowState właściwość, która śledzi bieżący stan tego wiersza przy użyciu wartości w wyliczenia DataRowState . Można zwrócić zmienione wiersze z zestawu danych lub tabeli danych, wywołując GetChanges metodę elementu DataSet lub DataTable. Możesz sprawdzić, czy zmiany istnieją przed wywołaniem GetChanges , wywołując metodę HasChanges zestawu danych.

Uwaga

Po zatwierdzeniu zmian w zestawie danych lub tabeli danych (wywołując metodę AcceptChanges ), GetChanges metoda nie zwraca żadnych danych. Jeśli aplikacja musi przetworzyć zmienione wiersze, należy przetworzyć zmiany przed wywołaniem AcceptChanges metody .

GetChanges Wywołanie metody zestawu danych lub tabeli danych zwraca nowy zestaw danych lub tabelę danych, która zawiera tylko rekordy, które zostały zmienione. Jeśli chcesz uzyskać określone rekordy — na przykład tylko nowe rekordy lub tylko zmodyfikowane rekordy — możesz przekazać wartość z DataRowState wyliczenia jako parametr do GetChanges metody .

DataRowVersion Użyj wyliczenia, aby uzyskać dostęp do różnych wersji wiersza (na przykład oryginalnych wartości, które znajdowały się w wierszu przed jego przetworzeniem).

Aby pobrać wszystkie zmienione rekordy z zestawu danych

  • Wywołaj metodę GetChanges zestawu danych.

    Poniższy przykład tworzy nowy zestaw danych o nazwie changedRecords i wypełnia go wszystkimi zmienionymi rekordami z innego zestawu danych o nazwie dataSet1.

    DataSet changedRecords = dataSet1.GetChanges();
    

Aby pobrać wszystkie zmienione rekordy z tabeli danych

  • Wywołaj metodę GetChanges elementu DataTable.

    Poniższy przykład tworzy nową tabelę danych o nazwie changedRecordsTable i wypełnia ją wszystkimi zmienionymi rekordami z innej tabeli danych o nazwie dataTable1.

    DataTable changedRecordsTable = dataTable1.GetChanges();
    

Aby pobrać wszystkie rekordy, które mają określony stan wiersza

  • Wywołaj metodę GetChanges zestawu danych lub tabeli danych i przekaż DataRowState wartość wyliczenia jako argument.

    W poniższym przykładzie pokazano, jak utworzyć nowy zestaw danych o nazwie addedRecords i wypełnić go tylko rekordami, które zostały dodane do dataSet1 zestawu danych.

    DataSet addedRecords = dataSet1.GetChanges(DataRowState.Added);
    

    W poniższym przykładzie pokazano, jak zwrócić wszystkie rekordy, które zostały ostatnio dodane do Customers tabeli:

    private NorthwindDataSet.CustomersDataTable GetNewRecords()
    {
        return (NorthwindDataSet.CustomersDataTable)
            northwindDataSet1.Customers.GetChanges(DataRowState.Added);
    }
    

Uzyskiwanie dostępu do oryginalnej wersji elementu DataRow

Po wprowadzeniu zmian w wierszach danych zestaw danych zachowuje zarówno oryginalne (Original) jak i noweCurrent wersje wiersza. Na przykład przed wywołaniem AcceptChanges metody aplikacja może uzyskać dostęp do różnych wersji rekordu (zgodnie z definicją w DataRowVersion wyliczaniu) i odpowiednio przetworzyć zmiany.

Uwaga

Różne wersje wiersza istnieją dopiero po jego edycji i przed wywołaniam AcceptChanges metody. Po wywołaniu AcceptChanges metody bieżące i oryginalne wersje są takie same.

Przekazanie DataRowVersion wartości wraz z indeksem kolumny (lub nazwą kolumny jako ciąg) zwraca wartość z określonej wersji wiersza tej kolumny. Zmieniona kolumna jest identyfikowana podczas zdarzeń ColumnChanging i ColumnChanged . Jest to dobry moment na sprawdzenie różnych wersji wierszy do celów weryfikacji. Jeśli jednak ograniczenia zostały tymczasowo zawieszone, te zdarzenia nie zostaną zgłoszone i trzeba będzie programowo określić, które kolumny uległy zmianie. Można to zrobić, iterując za pomocą Columns kolekcji i porównując różne DataRowVersion wartości.

Aby uzyskać oryginalną wersję rekordu

  • Uzyskaj dostęp do wartości kolumny, przekazując DataRowVersion wiersz, który chcesz zwrócić.

    W poniższym przykładzie pokazano, jak za pomocą DataRowVersion wartości uzyskać oryginalną wartość CompanyName pola w obiekcie DataRow:

    string originalCompanyName;
    originalCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Original].ToString();
    

Uzyskiwanie dostępu do bieżącej wersji elementu DataRow

Aby uzyskać bieżącą wersję rekordu

  • Uzyskaj dostęp do wartości kolumny, a następnie dodaj parametr do indeksu, który wskazuje, która wersja wiersza ma zostać zwrócona.

    W poniższym przykładzie pokazano, jak za pomocą wartości uzyskać bieżącą DataRowVersion wartość CompanyName pola w elemencie DataRow:

    string currentCompanyName;
    currentCompanyName = northwindDataSet1.Customers[0]
        ["CompanyName", DataRowVersion.Current].ToString();