Udostępnij za pośrednictwem


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

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 projektanta zestawów danych 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)
{

}

Weryfikowanie 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 w pojedynczej kolumnie. Zdarzenie ColumnChanging jest przydatne, gdy chcesz zweryfikować zmiany w określonych kolumnach. Informacje o proponowanej zmianie są przekazywane jako argument w zdarzeniu.
  • Zdarzenia RowChanging i RowChanged są wywoływane podczas i po każdej zmianie w wierszu. Wydarzenie RowChanging jest bardziej ogólne. Wskazuje, że zmiana następuje w którymś miejscu w wierszu, ale nie wiadomo, 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 będą generowane dla każdej zmiany.

Uwaga / Notatka

Metoda wiersza danych BeginEdit wyłącza zdarzenia RowChanging i RowChanged po każdej zmianie poszczególnej kolumny. W takim przypadku zdarzenie nie jest wywoływane do momentu wywołania metody EndEdit, a zdarzenia RowChanging 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, utwórz walidację przy użyciu zdarzenia ColumnChanging. 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 DataTable zgłasza zdarzenia, na które można reagować w trakcie ich występowania 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 typowanych zdarzeń, dla których można tworzyć programy obsługi: dataTableNameRowChanging, dataTableNameRowChanged, dataTableNameRowDeleting i 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

Zdarzenie Opis
ColumnChanging Wartość w kolumnie jest zmieniana. Zdarzenie przekazuje wiersz i kolumnę użytkownikowi 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 nie wywołano metody BeginEdit, zdarzenie RowChanging jest zgłaszane dla każdej zmiany w kolumnie natychmiast po zgłoszeniu zdarzenia ColumnChanging. Jeśli wywołano BeginEdit metodę przed wprowadzeniem zmian, RowChanging zdarzenie jest zgłaszane tylko podczas wywoływania EndEdit metody.

Zdarzenie przekazuje wiersz użytkownikowi wraz z wartością wskazującą, jaki rodzaj akcji (zmianę, wstawianie i tym podobne) jest wykonywany.
RowChanged Wiersz został zmieniony. Zdarzenie przekazuje użytkownikowi wiersz wraz z wartością wskazującą, jaki typ akcji (taki jak zmiana, wstawienie itd.) jest wykonywany.
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, RowChanging i RowDeleting są 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.

Zdarzenia ColumnChanged, RowChanged i 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 / Notatka

Projektant zestawów danych 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. Kiedy to zdarzenie jest wywoływane, przekazuje argument zdarzenia (ProposedValue), który zawiera proponowaną wartość dla bieżącej kolumny. Na podstawie zawartości e.ProposedValueelementu można wykonywać następujące czynności:

Walidację można również przeprowadzić podczas zdarzenia 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ą. Procedury obsługi zdarzeń zmieniające wartości w wierszach powinny przypominać poniższe przykłady.

Aby zweryfikować dane po zmianie wiersza (Visual Basic)

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

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

    Wskazówka

    Kliknij dwukrotnie na lewo od nazwy tabeli, aby utworzyć procedurę obsługi zdarzenia zmiany wiersza. 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 projektancie zestawów danych . Aby uzyskać więcej informacji, zobacz Przewodnik: tworzenie zestawu danych w Projektancie zestawów danych.

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

    Uwaga / Notatka

    Projektant zestawów danych nie tworzy automatycznie procedury obsługi zdarzeń dla RowChanging zdarzenia. Musisz utworzyć metodę do obsługi RowChanging zdarzenia i uruchomić kod, aby powiązać 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 właściwość RowState, która śledzi bieżący stan tego wiersza przy użyciu wartości w wyliczeniu DataRowState. Można zwrócić zmienione wiersze z zestawu danych lub tabeli danych, wywołując metodę GetChanges obiektu DataSet lub DataTable. Możesz sprawdzić, czy zmiany istnieją przed wywołaniem GetChanges , wywołując metodę HasChanges zestawu danych.

Uwaga / Notatka

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 obiektu 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);
    }
    

Uzyskaj dostęp do oryginalnej wersji 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 wyliczeniu DataRowVersion) i odpowiednio przetworzyć zmiany.

Uwaga / Notatka

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

Przekazanie wartości DataRowVersion wraz z indeksem kolumny (lub nazwą kolumny jako ciąg znakowy) zwraca wartość z 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

  • Aby uzyskać dostęp do wartości kolumny, przekaż DataRowVersion wiersza, który chcesz zwrócić.

    W poniższym przykładzie pokazano, jak przy użyciu wartości DataRowVersion uzyskać oryginalną wartość pola CompanyName w 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 użyć wartości DataRowVersion do uzyskania bieżącej wartości pola CompanyName w DataRow.

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