Ausnahmefehler korrekt zu handhaben, damit die Benutzer nicht mit obskuren Systemfehlermeldungen behelligt werden, ist normaler Bestandteil jeder .NET-Anwendung. Der Artikel zeigt, wie man Fehlern im Datenbankcode mit SQL Server und T-SQL begegnet.
Fehlerbehandlung in T-SQL
Der SQL-Dialekt T-SQL ermöglicht die einfache Handhabung nicht schwerwiegender Fehler, wie sie in einer gespeicherten Prozedur[1], einer Funktion oder etwas Ähnlichem auftauchen können. Aber nicht mit allen Fehlern kann man leicht umgehen.
Es gibt schwerwiegende und nicht schwerwiegende Fehler. Schwerwiegende Fehler führen im Gegensatz zu nicht schwerwiegenden Fehlern zu einem Programmabbruch. Es ist allerdings nicht genau dokumentiert, welche Fehler in welche Kategorie gehören. Doch der Anwendungscode kann schwerwiegende Datenbankfehler jederzeit mit try/catch-Blöcken auffangen. Für alle anderen Fehler sollte man die folgenden Techniken einsetzen.
Transaktionen
Durch eine Verwendung von Transaktionen im Datenbankcode lässt sich sicherzustellen, dass jegliche Änderungen dann und nur dann durchgeführt werden, wenn alles in Ordnung ist. Die Onlinehilfe von SQL Server beschreibt Transaktionen als logische Einheiten, die aus einer Reihe von Anweisungen bestehen (select, insert, update oder delete). Falls während der Transaktion keine Fehler auftreten, werden alle Modifikationen in der Transaktion permanenter Bestandteil der Datenbank. Falls Fehler auftreten, werden keinerlei Modifikationen an der Datenbank vorgenommen.
Transaktionen sind zwischen die Anweisungen BEGIN TRANSACTION und END TRANSACTION eingebettet. Die Anweisung ROLLBACK TRANSACTION ermöglicht ein Annullieren aller Änderungen. Erst mit der Anweisung COMMIT TRANSACTION werden die Änderungen permanent übernommen. Im Folgenden geht es darum, wie man Fehler in T-SQL behandelt.
@@Error
Die Funktion @@Error ermöglicht eine Fehlerbehandlung in T-SQL. Sie gibt den vom System generierten Fehlercode zurück. Falls kein Fehler auftritt, wird eine 0 ausgegeben.
Die @@Error-Funktion muss direkt nach einer T-SQL-Anweisung aufgerufen werden, andernfalls wird sie gelöscht.
RAISERROR
Die RAISERROR-Anweisung ermöglicht das Erzeugen einer individuellen Fehlermeldung oder die Verwendung einer der Fehlermeldungen, die in der Tabelle sysmessages gespeichert sind. Die Syntax kann man der Onlinedokumentation entnehmen.
Das einfachste Format umfasst die Meldung selbst (für individuelle Fehlermeldungen) oder eine entsprechende ID (für vorhandene Meldungen) zusammen mit einer Angabe von Schweregrad und Status. Der Status wird von SQL Server nicht verwendet, so dass man hier eine beliebige Zahl übergeben kann. Der Schweregrad gibt an, wie schwerwiegend der Fehler ist: 0 bis 18 ist für Benutzer, 19 bis 25 für Administratoren reserviert.
Im folgenden Code verwendet die als Beispiel dienende gespeicherte Prozedur diese Features zum Aktualisieren eines einzelnen Datensatzes in der Beispieldatenbank Nordwind. Sie setzt das Feld für die Telefonnummer auf einen der Prozedur übergebenen Wert, aber nur, wenn kein Fehler auftritt. Falls Probleme den Ablauf stören, wird ein negativer Rückgabewert ausgegeben - falls alles ohne Probleme ausgeführt werden kann, ein positiver.
Rückgabewerte von gespeicherten Prozeduren verwenden
Da die gespeicherte Prozedur Rückgabewerte liefert, kann man diese in seinem .NET-Code verwenden. Das Objekt SqlCommand ermöglicht ein einfaches Hinzufügen von Parametern zum Übergeben an die Prozedur sowie das Speichern von Rückgabewerten. Die Eigenschaft Direction des Parameters wird verwendet, um Rückgabewerte vom Aufruf einer gespeicherten Prozedur zu erhalten. Sie kann zwei Werte annehmen: InputOutput und Output. Im Beispiel wird Output verwendet, um den Statuswert zu erhalten.
Der Code ist eine einfache ASP.NET-Seite, die einen neuen Wert für einen bestimmten Eintrag in der Kundentabelle der Nordwind-Datenbank übergibt. Der ID-Wert wird in einem versteckten Feld gespeichert. Er könnte einfach an das Formular übergeben werden, aber das Feld funktioniert zu Demonstrationszwecken. Der in ein Textfeld eingegebene Wert wird verwendet, um das Feld mit der Telefonnummer in der Datenbanktabelle zu aktualisieren.
Die Parameter werden dem SqlCommand-Objekt hinzugefügt. Sie müssen exakt den Parameterwerten der gespeicherten Prozedur entsprechen. Der Befehl wird mithilfe der ExecuteNonQuery-Methode des SqlCommand-Objekts ausgeführt. Sobald der Befehl ausgeführt wurde, kann der Rückgabewert über diese Parameter abgerufen werden.
Der Code überprüft den Rückgabewert (-1 zeigt ein Problem an), und eine Meldung wird in einem Label-Steuerelement angezeigt. Außerdem wird ein try/catch-Block verwendet, um schwerwiegende Fehler abzufangen, die bei der Interaktion mit der Datenbank auftreten können.
URLs in diesem Artikel:
[1] = http:/