Umgang mit Datenbankfehlern

Adobe AIR 1.0 und höher

Im Wesentlichen ähnelt der Umgang mit Datenbankfehlern dem Umgang mit anderen Fehlern der Laufzeitumgebung. Sie sollten Code schreiben, der auf möglicherweise auftretende Fehler vorbereitet ist und auf die Fehler reagiert, anstatt dies der Laufzeitumgebung zu überlassen. Die möglichen Datenbankfehler lassen sich in drei Kategorien aufteilen; Verbindungsfehler, SQL-Syntaxfehler und Beschränkungsfehler.

Verbindungsfehler

Bei den meisten Datenbankfehlern handelt es sich um Verbindungsfehler, die bei jeder Operation auftreten können. Es gibt zwar Strategien zur Vermeidung von Verbindungsfehlern, allerdings gibt es kaum eine Möglichkeit zum problemlosen Beheben des Verbindungsfehlers, wenn die Datenbank ein kritischer Bestandteil Ihrer Anwendung ist.

Die meisten Verbindungsfehler haben damit zu tun, wie die Laufzeitumgebung mit dem Betriebssystem, dem Dateisystem und der Datenbankdatei interagiert. Ein Verbindungsfehler tritt zum Beispiel auf, wenn der Benutzer keine Berechtigung zum Erstellen einer Datenbankdatei an einem bestimmten Speicherort im Dateisystem hat. Die folgenden Strategien tragen zur Vermeidung von Verbindungsfehlern bei:

Verwenden Sie benutzerspezifische Datenbankdateien
Anstatt eine einzelne Datenbankdatei für alle Benutzer, die auf einem Computer mit der Anwendung arbeiten, zu verwenden, geben Sie jedem Benutzer eine eigene Datenbankdatei. Die Datei sollte sich in einem Verzeichnis befinden, das mit dem Benutzerkonto verknüpft ist. Dies könnte zum Beispiel im Speicherverzeichnis der Anwendung, im Dokumentordner des Benutzers oder auf dem Desktop des Benutzers sein.

Ziehen Sie verschiedene Benutzertypen in Betracht
Testen Sie Ihre Anwendung mit verschiedenen Benutzertypen unter verschiedenen Betriebssystemen. Gehen Sie nicht davon aus, dass der Benutzer über Administratorberechtigungen für seinen Computer verfügt. Setzen Sie nicht voraus, dass die Person, die die Anwendung installiert, auch der Benutzer ist, der mit der Anwendung arbeitet.

Verwenden Sie verschiedene Dateispeicherorte
Wenn Sie zulassen, dass Benutzer selbst festlegen, wo sie eine Datenbankdatei speichern oder eine Datei zum Öffnen auswählen, sollten Sie die möglichen Dateispeicherorte bedenken, die Benutzer verwenden können. Ziehen Sie außerdem in Erwägung, die Möglichkeiten der Benutzer einzuschränken, wenn es darum geht, Dateien zu speichern (oder wo sie Dateien öffnen können). So könnten Sie zum Beispiel festlegen, dass Benutzer nur Dateien öffnen können, die sich am Speicherort ihres Benutzerkontos befinden.

Wenn ein Verbindungsfehler auftritt, so geschieht dies meistens beim ersten Versuch, eine Datenbank zu erstellen oder zu öffnen. Dies bedeutet, dass der Benutzer keine datenbankbezogenen Operationen in der Anwendung ausführen kann. Bei bestimmten Fehlertypen, zum Beispiel Schreibschutz- oder Berechtigungsfehlern, ist ein mögliches Wiederherstellungsverfahren das Kopieren von Datenbankdateien an einen anderen Speicherort. Die Anwendung kann die Datenbankdatei an einen anderen Speicherort kopieren, für den der Benutzer Berechtigungen zum Erstellen und zum Schreiben in Dateien hat, und dann mit diesem Speicherort arbeiten.

Syntaxfehler

Ein Syntaxfehler tritt auf, wenn eine SQL-Anweisung fehlerhaft formuliert ist und die Anwendung versucht, diese Anweisung auszuführen. Da SQL-Anweisungen für lokale Datenbanken als Strings erstellt werden, ist die Überprüfung der SQL-Syntax zur Kompilierungszeit nicht möglich. Alle SQL-Anweisungen müssen ausgeführt werden, um die Syntax zu überprüfen. Mit den folgenden Strategien können Sie SQL-Syntaxfehler vermeiden:

Testen Sie alle SQL-Anweisungen gründlich
Testen Sie Ihre SQL-Anweisungen nach Möglichkeit separat, bevor Sie Anweisungstext in den Anwendungscode schreiben. Verwenden Sie zusätzlich ein Verfahren zum Testen des Codes, zum Beispiel Einheitentests, um einen Testsatz zu erstellen, der jede mögliche Option und Variation im Code ausprobiert.

Verwenden Sie Anweisungsparameter und vermeiden Sie das Verketten (dynamisches Generieren) von SQL
Wenn Sie Parameter verwenden und SQL-Anweisungen nicht dynamisch generieren, wird bei jeder Ausführung einer SQL-Anweisung derselbe Anweisungstext verwendet. Deshalb ist das Testen der Anweisungen und das Beschränken der möglichen Variationen viel einfacher. Lässt sich das dynamische Generieren einer SQL-Anweisung nicht vermeiden, beschränken Sie die dynamischen Teile der Anweisung auf ein Minimum. Validieren Sie die Benutzereingaben sorgfältig, um sicherzustellen, dass sie keine Syntaxfehler verursachen.

Zur Behebung eines Syntaxfehlers benötigt eine Anwendung komplexe Logiken, um eine SQL-Anweisung zu untersuchen und ihre Syntax zu korrigieren. Indem Sie die vorstehenden Richtlinien zur Vermeidung von Syntaxfehlern befolgen, kann Ihr Code potenzielle Laufzeitquellen von SQL-Syntaxfehlern identifizieren (zum Beispiel Benutzereingaben, die in einer Anweisung verwendet werden). Geben Sie den Benutzern Anleitungen zur Wiederherstellung nach einem Syntaxfehler. Geben Sie an, welche Korrekturen erforderlich sind, damit die Anweisung korrekt ausgeführt werden kann.

Beschränkungsfehler

Beschränkungsfehler treten auf, wenn eine INSERT - oder UPDATE -Anweidung versucht, einer Spalte Daten hinzuzufügen. Zu diesem Fehler kommt es, wenn die neuen Daten eine der definierten Beschränkungen für die Tabelle oder Spalte verletzen. Mögliche Beschränkungen sind:

Eindeutigkeitsbeschränkung
Gibt an, dass eine Spalte in jede Zeile der Tabelle einen anderen Wert enthalten muss. Wenn mehrere Spalten in einer Eindeutigkeitsbeschränkung zusammengefasst werden, darf die Kombination der Werte in diesen Spalten nicht doppelt vorkommen. Anders ausgedrückt: jede Zeile in der angegebenen Spalte bzw. in den angegebenen Spalten muss einmalig sein.

Primärschlüsselbeschränkung
In Bezug auf die Daten, die eine Beschränkung zulässt bzw. nicht zulässt, ist eine Primärschlüsselbeschränkung identisch mit einer Eindeutigkeitsbeschränkung.

Nicht-Null-Beschränkung
Legt fest, dass eine einzelne Spalte nicht den Wert NULL enthalten darf und deshalb in jeder Zeile einen Wert aufweisen muss.

Überprüfungsbeschränkung
Ermöglicht Ihnen, eine beliebige Beschränkung für eine oder mehrere Tabellen festzulegen. Eine häufig verwendete Überprüfungsbeschränkung ist eine Regel, die festlegt, dass der Wert einer Spalte innerhalb bestimmter Grenzen liegen muss (zum Beispiel, dass der Wert in einer numerischen Spalte größer als 0 sein muss). Eine weitere gebräuchliche Überprüfungsbeschränkung legt Beziehungen zwischen Spaltenwerten fest (zum Beispiel, dass sich der Werte einer Spalte von dem einer anderen Spalte in derselben Reihe unterscheiden muss).

Datentypbeschränkung (Spaltenaffinitätsbeschränkung)
Die Laufzeitumgebung erzwingt einen bestimmten Datentyp der Spaltenwerte. Wird versucht, Werte eines falschen Datentyps in einer Spalte zu speichern, tritt ein Fehler auf. In vielen Fällen werden Werte jedoch konvertiert, um zum Datentyp der Spalte zu passen. Weitere Informationen finden Sie unter Arbeiten mit Datenbankdatentypen .

Die Laufzeitumgebung erzwingt keine Beschränkungen für Fremdschlüsselwerte. Das bedeutet, das Fremdschlüsselwerte nicht mit einem vorhandenen Primärschlüsselwert übereinstimmen müssen.

Zusätzlich zu den vordefinierten Beschränkungstypen unterstützt die SQL-Engine der Laufzeitumgebung die Verwendung von Auslösern. Ein Auslöser ähnelt einer Ereignisprozedur. Es handelt sich um einen vordefinierten Satz von Anweisungen, die ausgeführt werden, wenn eine bestimmte Aktion eintritt. Sie können zum Beispiel einen Auslöser definieren, der ausgeführt wird, wenn Daten in eine bestimmte Tabelle eingefügt oder daraus gelöscht werden. Eine mögliche Verwendung von Auslösern ist die Untersuchung von Datenänderungen und das Ausgeben eines Fehler, wenn bestimmte Bedingungen nicht erfüllt sind. Ein Auslöser kann also demselben Zweck dienen wie eine Beschränkung und die Strategien zum Vermeiden und Beheben von Beschränkungsfehlern gelten auch für auslösergenerierte Fehler. Die Fehler-ID für auslösergenerierte Fehler unterscheidet sich jedoch von der Fehler-ID von Beschränkungsfehlern.

Den Satz der für eine bestimmte Tabelle gültigen Beschränkungen legen Sie beim Entwickeln der Anwendung fest. Wenn Sie Beschränkungen sorgfältig planen, ist die Entwicklung der Anwendung zur Vermeidung und Behebung von Beschränkungsfehlern einfacher. Es ist jedoch schwierig, Beschränkungsfehler systematisch vorherzusehen und zu verhindern. Das Vorhersehen ist schwierig, weil Beschränkungsfehler erst beim Hinzufügen von Anwendungsdaten auftreten. Beschränkungsfehler treten mit Daten auf, die einer Datenbank nach dem Erstellen hinzugefügt werden. Diese Fehler sind häufig das Ergebnis der Beziehung zwischen neuen Daten und Daten, die bereits in der Datenbank vorhanden sind. Die folgenden Strategien tragen dazu bei, viele Beschränkungsfehler zu vermeiden:

Planen Sie die Datenbankstruktur und Beschränkungen mit großer Sorgfalt
Beschränkungen dienen dazu, Anwendungsregeln umzusetzen und tragen zum Schutz der Integrität der Datenbankdaten bei. Wenn Sie Ihre Anwendung planen, überlegen Sie, wie die Datenbank zu strukturieren ist, um Ihre Anwendung zu unterstützen. Identifizieren Sie im Rahmen dieses Prozesses Regeln für Ihre Daten, zum Beispiel, ob bestimmte Werte erforderlich sind, ob es Standardvorgaben für die Werte gibt, ob doppelte Werte zulässig sind usw. Orientieren Sie sich an diesen Regeln, um Datenbankbeschränkungen zu definieren.

Geben Sie Spaltennamen explizit an
Eine INSERT -Anweisung lässt sich auch schreiben, ohne die Spalten, in die Werte eingefügt werden, ausdrücklich anzugeben; dies stellt jedoch ein unnötiges Risiko dar. Indem Sie explizit angeben, in welche Spalten Werte eingefügt werden sollen, können Sie automatisch generierte Werte zulassen, Spalten mit Standardwerten und Spalten, die NULL -Werte zulassen. Auf diese Weise können Sie außerdem sicherstellen, dass in alle NOT NULL -Spalten ein expliziter Wert eingefügt wird.

Verwenden Sie Standardwerte
Wenn Sie eine NOT NULL -Beschränkung für eine Spalte festlegen, geben Sie nach Möglichkeit einen Standardwert in der Spaltendefinition an. Der Anwendungscode kann ebenfalls Standardwerte bereitstellen. Ihr Code kann zum Beispiel überprüfen, ob eine Stringvariable null ist und ihr einen Wert zuweisen, bevor sie verwendet wird, um einen Parameter in einer Anweisung festzulegen.

Validieren Sie vom Benutzer eingegebene Daten
Überprüfen Sie vom Benutzer eingegebene Daten rechtzeitig, um sicherzustellen, dass durch Beschränkungen festgelegte Grenzen eingehalten werden, besonders bei NOT NULL - und CHECK -Beschränkungen. Eine UNIQUE -Beschränkung ist naturgemäß schwieriger zu überprüfen, da dies das Ausführen einer SELECT -Abfrage erfordert, um festzustellen, ob die Daten eindeutig ist.

Verwenden Sie Auslöser
Sie können einen Auslöser schreiben, der eingefügte Daten validiert (und ggf. ersetzt) oder andere Aktionen ausführt, um ungültige Daten zu korrigieren. Mit dieser Überprüfung und Korrektur kann das Auftreten eines Beschränkungsfehlers verhindert werden.

Beschränkungsfehler sind in mehrerer Hinsicht schwieriger zu verhindern als andere Fehlertypen. Es gibt jedoch verschiedene Strategien, um Beschränkungsfehler zu beheben, ohne die Anwendung instabil oder unbrauchbar zu machen:

Verwenden Sie Konfliktalgorithmen
Wenn Sie eine Beschränkung für eine Spalte definieren und eine INSERT - oder UPDATE -Anweisung erstellen, haben Sie die Möglichkeit, einen Konfliktalgorithmus anzugeben. Ein Konfliktalgorithmus definiert die Aktion, die die Datenbank ausführt, wenn eine Beschränkung verletzt wird. Die Datenbank-Engine kann verschiedene Aktionen ausführen. Die Datenbank-Engine kann eine einzelne Anweisung oder eine ganze Transaktion beenden. Sie kann den Fehler ignorieren. Sie kann alte Daten entfernen und durch die Daten ersetzen, die der Code zu speichern versucht.

Weitere Informationen finden Sie im Abschnitt „ON CONFLICT (Konfliktalgorithmen)“ unter SQL-Unterstützung in lokalen Datenbanken .

Geben Sie korrigierende Rückmeldungen
Die Beschränkungen, die einen bestimmten SQL-Befehl betreffen können, lassen sich rechtzeitig identifizieren. Dementsprechend können Sie Beschränkungsfehler, die eine Anweisung verursachen könnte, vorhersehen. Mit diesem Wissen können Sie eine Anwendungslogik erstellen, um auf Beschränkungsfehler zu reagieren. Angenommen, eine Anwendung enthält ein Dateneingabeformular, um neue Produkte einzugeben. Wenn die Produktnamenspalte in der Datenbank mit einer UNIQUE -Beschränkung definiert wurde, kann es beim Einfügen einer neuen Produktzeile in der Datenbank zu einem Beschränkungsfehler kommen. Die Anwendung wird deswegen so entwickelt, einen Beschränkungsfehler vorherzusehen. Wenn der Fehler auftritt, benachrichtigt die Anwendung den Benutzer, dass der angegebene Produktname bereits verwendet wird und fordert ihn auf, einen anderen Namen zu wählen. Eine andere Reaktion wäre, dem Benutzer Informationen zum Produkt mit demselben Namen anzuzeigen.