Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Datenzugriff mit ADO.NET und .NET Core

Fehlerbehandlung beim Datenbankzugriff

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Für korrekte Fehlerbehandlung bietet ADO.NET Core die Klassen SqlException und SqlError an.
05:32

Transkript

Würden wir nur in einer perfekten Welt leben, könnten wir diesen Abschnitt überspringen. Dennoch ist eine vernünftige Fehlerbehandlung natürlich bei Zugriffen auf Datenbanken essenziell. Und was letztlich das ADO.NET mir bietet, ist eine Möglichkeit, die Fehler, die die Datenquelle mir zurückgibt, in Objekte zu packen, sodass ich relativ komfortabel darauf zugreifen kann. Dafür gibt es eine Basisklasse, das ist "DbException". Auf SQL-Serverseite wäre das "SqlException", die wiederum eine Liste an Detailfehlern hat. Über "SqlErrors" kann ich auf diese Details zugreifen. Auch wenn ich in vielen Fällen nicht wirklich etwas machen kann mit den Fehlern. Dann sollte ich sie zumindest loggen, damit ich es später bei der Fehlersuche einfacher habe. Es gibt einige Fälle, da macht es sicher Sinn, die Fehler mit speziellen Aktionen zu belegen. Zum Beispiel wenn ich versuche mich anzumelden, das Kennwort stimmt nicht, dann kriege ich spezielle Fehlercodes, die ich dann auswerten kann, die mir dann die Möglichkeit geben, meiner Anwendung zu sagen: Pass auf, zeig jetzt diesen Dialog an und lass es den User nochmal versuchen. Ein Demo zu entwerfen, was Fehler erzeugt, ist relativ einfach, glauben Sie es mir. Ich habe hier zum Beispiel diesen Code. Er wird auf jeden Fall zu einem Fehler führen, weil ich habe mir hier vorhin die Freiheit genommen, "SELEKT" mit K statt mit C zu schreiben. Insofern wird das auf jeden Fall nicht unbedingt auf das Wohlwollen des SQL-Servers stoßen. Ich habe in diesem Bereich ganz normal den Zugriff. Ich baue die "Connection" auf, baue das "Command"-Objekt auf, und versuche entsprechend auch das auszuführen, was in dieser Konstante steht. Der gesamte Block ist in "try-catch" eingefasst. Das heißt, ich habe hier das "try", hier unten das "catch" stehen. Das Einzige, was mich hier interessiert, ist "SqlException". Das heißt, sollte es wider Erwarten zu einer anderen Art von Exception kommen, würde die an der Stelle nicht gefangen werden. Innerhalb des "catch"-Blocks kann ich dann einmal die Exception selbst ausgeben. Die "Message" ist da für mich interessant erstmal. Jedes "SqlException"-Objekt hat eine Auflistung, "Errors" heißt die. Die besteht aus einzelnen "SqlError"-Objekten. Die wiederum geben mir weitere Details. Es ist genau bei dieser Datenbankplattform so, dass es sein kann, dass ein Fehler einen anderen verursacht und sozusagen eine ganze Reihe von Fehlern hoch an die Applikationsschicht geliefert werden. Daher gibt es hier diese Auflistung. Ich führe das Ganze mal aus. Mache hier in der Zeile, wo ich das Statement ausführe mit "ExecuteScalar", einen Breakpoint rein. Dann sorge ich hier oben für einen Aufruf und starte das Ganze mit F5. Das heißt, wenn ich jetzt weitergehe, dann müsste die nächste Zeile, die ausgeführt wird, genau die 396 sein. Dort habe ich das Objekt. Ich kann einen Blick in das "Exception"-Objekt werfen. Er sagt mir "Incorrect syntax near *'." Das ist natürlich auch irgendwo richtig, aber nicht besonders hilfreich. Ich habe keine "InnerException". Ich habe hier eine Auflistung von Fehlern. Kann vielleicht auch hier unten in die einzelnen Fehler reingehen. Hier ist nur einer. Das sehe ich schon an der Anzahl. Kann dann hier entsprechend mir die Informationen raussuchen, die ich da brauche möglicherweise. Dann gehe ich weiter. Ich gehe durch diese "foreach"-Schleife. Jedes "SqlError"-Objekt hat wiederum eigene Eigenschaften, zum Beispiel die Zeile, in der das Problem aufgetreten ist, die Message vom SQL-Server, der Fehlercode. Wenn es eine Prozedur war, welche Prozedur war es. Der Server selbst, das ist nicht überraschend, das ist der, der auch im "ConnectionString" verwendet wurde. Es könnte durchaus ein anderer sein, wenn Sie sowas wie Linked Server haben, kann es sein, dass Sie sich zwar mit Server A verbinden, aber von Server B vielleicht bei irgendeiner Art von Abfrage einen Fehler bekommen. Das kann ich ausgeben, das mache ich mal. Ich lasse es mal zu Ende laufen. Dann sieht das ungefähr so aus. Das sind Informationen, die Sie möglicherweise natürlich zusammen mit anderen Informationen in ein Debug Log schreiben sollten, damit Sie wissen, ich habe offenbar ein Problem, hier gab es einen Fehler. Wenn ich vorher zum Beispiel dieses Statement auch ins Debug Log geschrieben hätte, könnte ich mit dem zweiten Blick erkennen, Moment, das war nicht so gut. Hier muss es "SELECT" mit C lauten. Die Problematik wäre gelöst an der Stelle. Das heißt, damit komme ich relativ nah an die Fehler ran. Ich rate Ihnen auch, als Best Practice nicht alle Exceptions abzufangen. Sondern ich erwarte in einem Block, der mit ADO.NET arbeitet, oder mit einem Block, der speziell mit SQL-Server arbeitet, natürlich an der Stelle auch nur solche Fehlermeldungen, nicht was wie "Out of memory" und was es alles geben kann. Sondern einfach nur, in dem Fall, themenbezogene Ausnahmen. Das ist, wie gesagt, alles, was ich dann abfange. Der Rest würde dann an den Aufrufer weitergehen, falls da wirklich noch etwas auftreten sollte. Und müsste da gehandelt werden.

Datenzugriff mit ADO.NET und .NET Core

Lernen Sie, wie mit Ihrer .NET Core-Anwendung auf relationale Datenbanken wie z.B. SQL Server oder SQLite zugreifen.

2 Std. 49 min (28 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!