Databasefouten verhelpen

Adobe AIR 1.0 of hoger

Over het algemeen verloopt het verhelpen van databasefouten zoals het verhelpen van andere runtimefouten. U wordt aangeraden code te schrijven die is voorbereid op het optreden van mogelijke fouten en deze kan verhelpen, in plaats van dit door de runtime te laten doen. Databasefouten worden doorgaans in drie categorieën verdeeld: verbindingsfouten, SQL-syntaxisfouten en beperkingsfouten.

Verbindingsfouten

De meeste databasefouten zijn verbindingsfouten. Deze kunnen tijdens alle bewerkingen optreden. Er zijn weliswaar strategieën voor het voorkomen van verbindingsfouten maar er is slechts zelden een eenvoudige manier om zonder problemen van een verbindingsfout te herstellen als de database een belangrijk deel is van uw toepassing.

De meeste verbindingsfouten worden veroorzaakt door de manier waarop de runtime interageert met het besturingssysteem, het bestandssysteem en het databasebestand. Er treedt bijvoorbeeld een verbindingsfout op als de gebruiker geen toestemming heeft om een databasebestand te creëren op een bepaalde locatie van het bestandssysteem. De volgende strategieën helpen verbindingsfouten te voorkomen:

Gebruik gebruikersspecifieke databasebestanden
Geef iedere gebruiker zijn of haar eigen databasebestand, in plaats van één databasebestand te gebruiken voor alle gebruikers die de toepassing op één computer gebruiken. Plaats het bestand in een directory die aan de account van de gebruiker is gekoppeld. Dit kan bijvoorbeeld de opslagmap van de toepassing, de documentenmap van de gebruiker of het bureaublad van de gebruiker zijn.

Houd rekening met verschillende soorten gebruikers
Test uw toepassing met verschillende soorten gebruikersaccounts in verschillende besturingssystemen. Ga er niet van uit dat de gebruiker beheerdersrechten heeft voor de computer. Ga er ook niet van uit dat de persoon die de toepassing heeft geïnstalleerd, de gebruiker is die de toepassing uitvoert.

Houd rekening met verschillende bestandslocaties
Als u een gebruiker toestaat de opslaglocatie van een databasebestand te bepalen of het te openen bestand te selecteren, moet u rekening houden met de mogelijke bestandslocaties die de gebruikers kunnen selecteren. Bovendien kunt u het best de lijst van mogelijke opslaglocaties (of bronlocaties voor het openen) voor databasebestanden beperken. U kunt bijvoorbeeld gebruikers alleen toestaan bestanden te openen die zich binnen de opslaglocatie van hun gebruikersaccount bevinden.

Als een verbindingsfout optreedt, is dit doorgaans bij de eerste poging om de database te creëren of te openen. Dit betekent dat de gebruiker geen enkele databasegerelateerde bewerking in de toepassing kan uitvoeren. Voor bepaalde soorten fouten, zoals alleen-lezen of toegangsrechtfouten, is een van de mogelijke hersteltechnieken het kopiëren van het databasebestand naar een andere locatie. De toepassing kan het databasebestand kopiëren naar een locatie waarvoor de gebruiker wel toegangsrechten heeft om bestanden te creëren en te wijzigen, en vervolgens die nieuwe locatie gebruiken.

Syntaxisfouten

Een syntaxisfout treedt op als de toepassing een SQL-instructie probeert uit te voeren die niet goed is geformuleerd. Aangezien SQL-instructies voor lokale databases als tekenreeksen zijn gecreëerd, is het niet mogelijk om de SQL-syntaxis tijdens het compileren te controleren. Alle SQL-instructies moeten worden uitgevoerd om hun syntaxis te controleren. Pas de volgende strategieën toe om SQL-syntaxisfouten te voorkomen:

Voer een grondige test uit van alle SQL-instructies
Indien mogelijk moet u uw SQL-instructies tijdens de ontwikkeling van uw toepassing apart testen voordat u ze als instructietekst in de toepassingscode codeert. Bovendien wordt u aangeraden een codetestfase in te plannen (zoals het testen per eenheid) om een set van tests te creëren die elke mogelijke optie en codevariatie testen.

Gebruik instructieparameters en vermijd het samenvoegen (dynamisch genereren) van SQL
Parameters gebruiken, en dynamisch gegenereerde SQL-instructies vermijden, betekent dat dezelfde SQL-instructietekst wordt gebruikt elke keer dat een instructie wordt uitgevoerd. Hierdoor is het veel eenvoudiger om uw instructies te testen en de mogelijke variaties te beperken. Als u een SQL-instructie dynamisch moet genereren, moet u de dynamische delen van de instructie tot het minimum beperken. Ga ook zorgvuldig te werk bij het valideren van gegevensinvoer om te zorgen dat deze geen syntaxisfouten veroorzaakt.

Een toepassing die van een syntaxisfout moet herstellen, heeft complexe logica nodig om een SQL-instructie te controleren en de syntaxis te corrigeren. Door de volgende richtlijnen voor het voorkomen van syntaxisfouten in acht te nemen, kan uw code mogelijke runtimebronnen van SQL-syntaxisfouten (zoals gebruikersinvoer in een instructie) identificeren. Zorg dat de gebruiker over richtlijnen beschikt als een syntaxisfout optreedt. Geef aan wat de gebruiker moet corrigeren om te zorgen dat de instructie correct wordt uitgevoerd.

Beperkingsfouten

Beperkingsfouten treden op wanneer de instructie INSERT of UPDATE gegevens aan een kolom probeert toe te voegen. De fout treedt op als de nieuwe gegevens een van de vooraf gedefinieerde beperkingen voor de tabel of kolom schenden. U kunt onder andere de volgende beperkingen instellen:

Beperking ‘uniek’
Geeft aan dat geen enkele rij van de tabel een al bestaande waarde mag bevatten binnen een bepaalde kolom. Of u kunt aangeven dat wanneer meerdere kolommen worden gecombineerd in één beperking, de combinatie van waarden in de desbetreffende kolommen niet mag worden gedupliceerd. Met andere woorden, elke rij moet verschillend zijn op het gebied van de opgegeven unieke kolom(men).

Beperking ‘primaire sleutel’
Wat de gegevens betreft die een beperking (niet) toestaat, is een beperking ‘primaire sleutel’ hetzelfde als een beperking ‘uniek’.

Beperking ‘niet leeg’
Geeft aan dat een bepaalde kolom niet de waarde NULL mag bevatten, met andere woorden, dat alle rijen in de desbetreffende kolom een waarde moeten hebben.

Beperking ‘controle’
Biedt u de mogelijkheid om een willekeurige beperking in te stellen voor een of meer tabellen. Een veel voorkomende beperking van het ‘controle’ is een regel die bepaalt dat de waarde in een kolom zich binnen een bepaald bereik moet bevinden (bijvoorbeeld dat de waarde in een numerieke kolom groter moet zijn dan 0). Een andere veel voorkomende beperking van het type ‘controle’ definieert relaties tussen kolomwaarden (bijvoorbeeld dat de waarde in een kolom moet verschillen van de waarde in een andere kolom op dezelfde rij).

Beperking ‘gegevenstype’
De runtime legt het gegevenstype voor de kolomwaarden op en er treedt een fout op als wordt geprobeerd om een waarde op te slaan die niet het juiste type heeft voor de kolom. In vele situaties worden waarden echter omgezet zodat ze het gegevenstype hebben dat is ingesteld voor de kolom. Zie Werken met gegevenstypen voor meer informatie.

De runtime legt geen beperkingen op voor vreemde-sleutelwaarden. Met andere woorden, vreemde-sleutelwaarden hoeven niet overeen te komen met een bestaande primaire-sleutelwaarde.

Naast de vooraf gedefinieerde typen beperkingen ondersteunt de SQL-runtime-engine het gebruik van triggers. Een trigger is te vergelijken met een gebeurtenishandler. Het is een vooraf gedefinieerde instructieset die worden uitgevoerd wanneer zich een bepaalde actie voordoet. U kunt bijvoorbeeld een trigger definiëren die worden geactiveerd wanneer gegevens worden ingevoegd in of verwijderd uit een bepaalde tabel. Een voorbeeld van het gebruik van een trigger is het controleren van wijzigingen in gegevens en het weergeven van een foutmelding als niet wordt voldaan aan de opgegeven voorwaarden. Dit betekent dat een trigger hetzelfde doel kan hebben als een beperking, en dat de strategieën voor het voorkomen en herstellen van beperkingsfouten ook gelden voor fouten die door een trigger worden gegenereerd. De fout-id voor fouten die door een trigger worden gegenereerd, verschilt echter van de fout-id voor beperkingsfouten.

De set van beperkingen die gelden voor een bepaalde tabel wordt gedefinieerd terwijl u een toepassing ontwikkelt. Door goed na te denken bij het definiëren van beperkingen vergemakkelijkt u het voorkomen en herstellen van beperkingsfouten in uw toepassingen. Beperkingsfouten zijn echter moeilijk systematisch te voorspellen en te voorkomen. Het voorspellen is moeilijk omdat beperkingsfouten pas optreden wanneer toepassingsgegevens worden toegevoegd. Beperkingsfouten treden op wanneer gegevens aan een database worden toegevoegd nadat deze is gecreëerd. Deze fouten zijn vaak het resultaat van de relatie tussen nieuwe gegevens en gegevens die al in de database aanwezig zijn. De volgende strategieën kunnen u helpen veel voorkomende beperkingsfouten te voorkomen:

Plan de databasestructuur en de beperkingen zorgvuldig
Het doel van beperkingen is toepassingsregels op te leggen en te helpen de integriteit van de databasegegevens te beveiligen. Denk tijdens het plannen van uw toepassing na over de structuur van uw database zodat deze uw toepassing kan ondersteunen. Hierbij identificeert u regels voor de gegevens, zoals of bepaalde waarden vereist zijn, een waarde een standaardinstelling heeft, dubbele waarden zijn toegestaan enzovoort. Deze regels helpen u bij het definiëren van databasebeperkingen.

Geef expliciet kolomnamen op
U kunt de instructie INSERT gebruiken zonder expliciet de kolommen op te geven waarin waarden zullen worden ingevoegd. Dit is echter een onnodig risico. Door expliciet de kolommen te benoemen waarin waarden zullen worden ingevoegd, kunt u automatisch gegenereerde waarden, kolommen met standaardwaarden en kolommen met de waarde NULL gebruiken. Bovendien zorgt u hierdoor dat in alle kolommen van het type NOT NULL een expliciete waarde wordt ingevoegd.

Gebruik standaardwaarden
Wanneer u de beperking NOT NULL voor een kolom opgeeft, geeft u wanneer mogelijk een standaardwaarde in de kolomdefinitie op. Ook toepassingscode kan in standaardwaarden voorzien. Uw code kan bijvoorbeeld controleren of een tekenreeksvariabele de waarde null heeft en er een waarde aan toewijzen voordat de variabele wordt gebruikt om de waarde van een instructieparameter in te stellen.

Valideer gebruikersinvoer
Controleer gebruikersinvoer voordat de gegevens daadwerkelijk in de database worden ingevoegd om te zorgen dat de invoer aan de beperkingen voldoet, met name in het geval van de beperkingen NOT NULL en CHECK . De beperking UNIQUE is uiteraard moeilijker te controleren omdat een SELECT -query moet worden uitgevoerd om te bepalen of de gegevens uniek zijn.

Gebruik triggers
U kunt een trigger schrijven die ingevoegde gegevens verifieert (en mogelijk vervangt) of andere acties uitvoert om ongeldige gegevens te corrigeren. Deze verificatie- en correctieacties kunnen beperkingsfouten voorkomen.

In vele opzichten zijn beperkingsfouten moeilijker te voorkomen dan andere fouttypen. Gelukkig zijn er verschillende strategieën om van beperkingsfouten te herstellen zonder dat de toepassing instabiel of onbruikbaar wordt:

Gebruik conflictalgoritmen
Als u een beperking voor een kolom definieert en als u de instructie INSERT of UPDATE creëert, kunt u desgewenst een conflictalgoritme opgeven. Een conflictalgoritme definieert de actie die de database uitvoert als een beperkingsfout optreedt. De database-engine kan verschillende mogelijke acties uitvoeren. De database-engine kan één instructie of een complete transactie beëindigen. De engine kan de fout negeren. Of zelfs oude gegevens verwijderen en deze vervangen door de gegevens die de code probeert op te slaan.

Zie de sectie "ON CONFLICT (conflictalgoritmen)" in SQL-ondersteuning in lokale databases voor meer informatie.

Geef feedback met een oplossing
De set van beperkingen die een bepaalde SQL-opdracht kunnen beïnvloeden, kan van tevoren worden geïdentificeerd. Dit betekent dat u beperkingsfouten die door een instructie kunnen worden veroorzaakt, kunt voorspellen. Op die kennis kunt u toepassingslogica baseren die op een beperkingsfout reageert. Een toepassing bevat bijvoorbeeld een formulier voor het invoeren van nieuwe producten. Als de kolom met de productnaam in de database is gedefinieerd met een beperking van het type UNIQUE , kan het invoegen van een nieuwe productrij in de database een beperkingsfout veroorzaken. Daarom wordt de toepassing zo ontwikkeld dat deze van tevoren rekening houdt met een beperkingsfout. Als de fout optreedt, waarschuwt de toepassing de gebruiker dat de opgegeven productnaam al bestaat en dat een andere naam moet worden gekozen. Een andere mogelijke reactie is dat informatie over het andere product met dezelfde naam wordt weergegeven.