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. Technologie te są 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 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 .
Weryfikacja danych
Walidacja w zestawie danych jest realizowana w następujący sposób:
Tworząc własną walidację specyficzną dla aplikacji, która może sprawdzać wartości w poszczególnych kolumnach danych podczas zmian. Aby uzyskać więcej informacji, zobacz How to: Validate data during column changes (Instrukcje: weryfikowanie danych podczas zmian kolumn).
Tworząc własną walidację specyficzną dla aplikacji, która może sprawdzać dane do wartości, gdy zmienia się cały wiersz danych. Aby uzyskać więcej informacji, zobacz How to: Validate data during row changes (Instrukcje: weryfikowanie danych podczas zmian wierszy).
Tworząc klucze, unikatowe ograniczenia i tak dalej w ramach rzeczywistej definicji schematu zestawu danych.
Ustawiając właściwości DataColumn obiektu, takie jak MaxLength, AllowDBNulli Unique.
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
, , 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
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
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. Po wyświetleniu tego zdarzenia przekazuje argument zdarzenia (ProposedValue), który zawiera wartość proponowaną dla bieżącej kolumny. Na podstawie zawartości e.ProposedValue
elementu 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)
Otwórz zestaw danych w Projektancie zestawów danych. Aby uzyskać więcej informacji, zobacz Przewodnik: tworzenie zestawu danych w Projektancie zestawów danych.
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#)
Otwórz zestaw danych w Projektancie zestawów danych. Aby uzyskać więcej informacji, zobacz Przewodnik: tworzenie zestawu danych w Projektancie zestawów danych.
Kliknij dwukrotnie pasek tytułu tabeli, którą chcesz zweryfikować. Ta akcja powoduje utworzenie pliku klasy częściowej dla elementu DataTable.
Uwaga
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 podłączyć zdarzenie w metodzie inicjowania tabeli.
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 nazwiedataSet1
.
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 nazwiedataTable1
.
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 dodataSet1
zestawu danych.W poniższym przykładzie pokazano, jak zwrócić wszystkie rekordy, które zostały ostatnio dodane do
Customers
tabeli:
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:
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: