EDM: Ausnahmen beim Speichern behandeln

Wenn Sie ein Abonnement des Magazins 'DATENBANKENTWICKLER' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.

EDM: Ausnahmen beim Speichern behandeln

Die Validierung bei der Eingabe von Daten ist eines der wichtigsten Themen bei der Erstellung benutzerfreundlicher Anwendungen. In diesem ersten Artikel zu diesem Thema wollen wir uns darauf beschränken, solche Eingabefehler abzufangen, welche durch die Restriktionen im Datenmodell und entsprechende Fehleingaben entstehen. Das sind beispielsweise Fehler, die auftreten, weil der Benutzer keinen Wert in ein Feld eingibt, dass nicht leer sein darf oder der Datentyp des Feldes nicht mit dem eingegebenen Wert korrespondiert.

Beispielanwendung

Wie bei den meisten Artikeln dieser Ausgabe wollen wir unser Know-how an der Beispielanwendung Bestellverwaltung ausprobieren. Diese hat in einigen Tabellen Restriktionen, gegeben die wir über die Eingabe in den beiden vorgestellten Seiten Kundenuebersicht oder Artikeluebersicht verstoßen können. Das wären beispielsweise Folgende:

  • Das Feld Bezeichnung in der Tabelle Artikel darf nicht Null sein, muss also einen Wert enthalten.
  • Für die Fremdschlüsselfelder AnredeID der Tabelle Kunden oder KategorieID der Tabelle Artikel muss ein Wert angegeben werden.
  • Andere Felder sind grundsätzlich aufgrund ihres Datentyps auf die Eingabe bestimmter Werte beschränkt – zum Beispiel können Sie keinen Text in ein Zahlen- oder Datumsfeld eingeben.

Ablauf ohne Validierung

Schauen wir uns an, was geschieht, wenn wir keine Vorsichtsmaßnahmen treffen und davon ausgehen, dass der Benutzer die korrekten Werte in die Felder eingibt und auch alle Pflichtfelder ausfüllt. Nehmen wir also an, dass der Benutzer einen neuen Artikel anlegt und vor dem Klick auf die Schaltfläche Speichern keine Bezeichnung eingibt und auch keine Kategorie auswählt (siehe Bild 1).

Speichern eines Datensatzes ohne Angabe der Bezeichnung

Bild 1: Speichern eines Datensatzes ohne Angabe der Bezeichnung

Dann liefert Visual Studio die Ausnahme aus Bild 2. Die hier angegebene Information, es sei eine Ausnahme des Typs System.Data.Entity.Validation.DbEntityValidationException liefert noch keine echte Hilfe beim Beheben des Problems.

Ausnahme beim Versuch, Daten ohne Füllen eines Feldes zu speichern, das keine Nullwerte akzeptiert

Bild 2: Ausnahme beim Versuch, Daten ohne Füllen eines Feldes zu speichern, das keine Nullwerte akzeptiert

Also klicken Sie auf den Link Details anzeigen... und erhalten eine weitere Meldung, die diesmal den Hinweis Fehler bei der Überprüfung einer oder mehrerer Entitäten liefert. Wir erfahren noch, dass die Methode SaveChanges den Fehler ausgelöst hat, aber das war es dann auch.

Wir können an dieser Stelle nur die Meldung ausblenden und die Ausführung beenden. Selbst, wenn Sie auf den Link Ausnahmedetail in die Zwischenablage kopieren anklicken und den Inhalt der Zwischenablage anschließend in einen Editor Ihrer Wahl einfügen, erhalten Sie hier keine nennenswerten weiteren Informationen.

Einzelnen Fehler provozieren

Schauen wir uns nun an, was geschieht, wenn wir nur die Bezeichnung auslassen. In diesem Fall erhalten wir den gleichen Fehler, als wenn wir die Bezeichnung und die Kategorie weglassen. Unter Messsage erhalten wir dann, wenn wir in die Tiefe gehen, die folgende Meldung:

Fehler bei der Überprüfung einer oder mehrerer Entitäten. Weitere Informationen finden Sie in den Erläuterungen zur EntityValidationErrors-Eigenschaft.

Um den Fehler weiter zu untersuchen, fassen wir die SaveChanges-Methode in einen Try...Catch-Block ein, der wie folgt aussieht:

try {
     dbContext.SaveChanges();
}
catch (Exception ex) {
     message = string.Format("Fehler: {0}", ex.Message);
     Debug.WriteLine(message);
     message = string.Format("Typ: {0}", ex.GetType());
     Debug.WriteLine(message);
}

Wir fangen also eine einfache Exception ab und geben im Ausgabefenster den Inhalt der Eigenschaften Message und GetType des Exception-Objekts aus. Das Ergebnis sieht wie folgt aus:

Fehler: Fehler bei der Überprüfung einer oder mehrerer Entitäten. Weitere Informationen finden Sie in den Erläuterungen zur EntityValidationErrors-Eigenschaft.
Typ: System.Data.Entity.Validation.DbEntityValidationException

Da wir nun wissen, dass es sich um eine Exception des Typs DbEntityValidationException handelt, können wir nun gezielt diese Exception abfangen.

DbEntityValidationException abfangen

Die Abfrage der Exception DbEntityValidationException bauen wir wie in Listing 1 in die Methode btnSpeichern_Click ein. Den bestehenden Catch-Zweig mit der Standard­exception behalten wir bei, damit auch andere Fehler behandelt werden. Der neue Catch-Zweig gibt zunächst eine Meldung aus, dass ein Fehler aufgetreten ist. Dann durchläuft er in einer foreach-Schleife alle Elemente des Typs DbEntityValidationResult der Auflistung EntityValidationErrors und speichert diese in der Variablen item.

try {
     dbContext.SaveChanges();
}
catch (DbEntityValidationException ex) {
     Debug.WriteLine("Fehler beim Speichern:");
     Debug.WriteLine("=====================================");
     foreach (DbEntityValidationResult item in ex.EntityValidationErrors) {
         DbEntityEntry entry = item.Entry;
         string entityTypeName = entry.Entity.GetType().Name;
         foreach (DbValidationError subItem in item.ValidationErrors) {
             string message = string.Format("Fehlerbeschreibung: '{0}'", subItem.ErrorMessage);
             Debug.WriteLine(message);
             message = string.Format("Tabelle/Entität: {0}", entityTypeName);
             Debug.WriteLine(message);

Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.

Bitte geben Sie die Zeichenfolge in das nachfolgende Textfeld ein

Die mit einem * markierten Felder sind Pflichtfelder.

Neues aus unseren Magazinen
Listenfeld: Reihenfolge mehrerer Einträge...

Wir haben bereits in mehreren Beiträgen beschrieben, wie Sie die individuelle Reihenfolge von Elementen einer Tabelle über den Inhalt eines Feldes etwa namens »ReihenfolgeID« einstellen können –... [mehr]

Diagramme mit gefilterten Daten

In Ausgabe 2/2019 haben wir in zwei Artikeln die modernen Diagramme von Access vorgestellt. Im vorliegenen Beitrag zeigen wir Ihnen, wie Sie diese abhängig von den in einem Formular angezeigten... [mehr]

Benutzerverwaltung mit verschlüsselten...

Wenn Sie in einer Access-Anwendung Benutzer verwalten wollen, die sich per Benutzername und Kennwort an die Anwendung anmelden, sollten Sie sehr sensibel mit den in der Anwendung gespeicherten... [mehr]

HTML-Tabellen mit fester Kopfzeile

In den vorherigen Ausgaben von Access im Unternehmen und in der aktuellen Ausgabe arbeiten wir in einigen Beiträgen mit dem Webbrowser-Steuerelement und stellen Daten, die wir mit den Bordmitteln... [mehr]

Flexible HTML-Tabellen mit fester Kopfzeile

Im Beitrag »HTML-Tabellen mit fester Kopfzeile« haben wir gezeigt, wie Sie Daten aus einer bestimmten Abfrage in einem Webbrowser-Steuerelement so anzeigen, dass die Spaltenköpfe oben fixiert... [mehr]

Berechtigungen per HTML verwalten

Im Beitrag »Benutzerverwaltung mit verschlüsselten Kennwörtern« stellen wir eine Lösung vor, in der wir die Berechtigungen von Benutzergruppen an Datenbankobjekten definieren. Dort benötigen wir... [mehr]

Benutzer und Berechtigungen ermitteln

In den Beiträgen »Benutzerverwaltung mit verschlüsselten Kennwörtern« und »Berechtigungen per HTML verwalten« haben wir die Voraussetzungen für eine Benutzerverwaltung geschaffen. Im vorliegenden... [mehr]

Zugriffsrechte mit Datenmakros

Es gibt verschiedene Möglichkeiten, auf Basis des aktuell angemeldeten Benutzers sicherzustellen, dass dieser nur die für ihn vorgesehenen Aktionen mit Daten durchführen darf – beispielsweise durch... [mehr]

Kennwörter generieren

Für den einen oder anderen Zweck möchten Sie vielleicht Kennwörter generieren oder in einer Benutzeroberfläche die Möglichkeit zum Generieren von Kennwörtern anbieten. Wenn Sie etwa Benutzer zu... [mehr]

Neuer Datensatz von Frontend zu Backend

Für manche Themen gibt es keine kurze, prägnante Überschrift. In diesem Fall wollen wir zeigen, wie Sie einen neuen Datensatz anlegen, der in einer temporären Tabelle im Frontend gespeichert wird,... [mehr]