Hantera databasfel

Adobe AIR 1.0 och senare

Hanteringen av databasfel fungerar i stort sett som annan hantering av körningsfel. Du bör skriva kod som är förberedd på olika fel som kan uppstå, och åtgärda felen i stället för att överlämna detta till körningen. De databasfel som kan uppstå kan i stort delas in i tre kategorier: anslutningsfel, SQL-syntaxfel och begränsningsfel.

Anslutningsfel

De flesta databasfel är anslutningsfel, och de kan uppstå vid alla typer av åtgärder. Även om det finns strategier för att förhindra anslutningsfel finns det sällan något enkelt sätt att göra en snygg återställning vid ett anslutningsfel om databasen är en kritisk del av programmet.

De flesta anslutningsfel har att göra med hur körningen interagerar med operativsystemet, filsystemet och databasfilen. Ett anslutningsfel uppstår till exempel om användaren inte har behörighet att skapa en databasfil på en viss plats i filsystemet. Du kan förhindra anslutningsfel med hjälp av följande strategier:

Använd användarspecifika databasfiler
I stället för att använda en enda databasfil för alla användare som använder programmet på en dator, ger du varje användare en egen databasfil. Filen ska finnas i en katalog som är associerad med användarens konto. Den kan till exempel lagras i programmets lagringskatalog, i användarens dokumentmapp eller på användarens skrivbord.

Använd olika typer av användarkonton
Testa att använda olika typer av användarkonton för programmet på olika operativsystem. Ta inte för givet att användaren har administratörsbehörighet på datorn. Ta inte heller för givet att personen som installerade programmet är den användare som kör programmet.

Använd olika filsökvägar
Om du låter en användare ange var databasfilen ska kunna sparas eller välja vilken fil som ska öppnas, bör du överväga möjliga filsökvägar som användarna kan använda. Du bör dessutom överväga att definiera begränsningar för var användarna kan lagra (eller öppna) databasfiler. Du kan till exempel låta användarna endast öppna filer som finns på lagringsplatsen för användarkontot.

Om det uppstår ett anslutningsfel är det mest troligt att det sker vid det första försöket att skapa eller öppna databasen. Detta innebär att användaren inte kan göra några databasrelaterade åtgärder i programmet. För vissa typer av fel, till exempel fel som rör skrivskydd eller behörighet, är en möjlig återställningsteknik att kopiera databasfilen till en annan plats. Programmet kan kopiera databasfilen till en annan plats där användaren har behörighet att skapa eller skriva till filer, och använda den platsen i stället.

Syntaxfel

Ett syntaxfel uppstår när programmet försöker köra en SQL-sats som är felformaterad. Eftersom SQL-satser för lokala databaser skapas som strängar går det inte att utföra en SQL-syntaxkontroll vid kompileringen. Du måste kontrollera alla SQL-satsers syntax genom att köra dem. Använd följande strategier för att förhindra SQL-syntaxfel:

Testa alla SQL-satser noggrant
När du utvecklar ditt program ska du, om möjligt, testa SQL-satserna separat innan du skriver dem som satstext i programkoden. Använd dessutom en kodtestningsmetod, till exempel enhetstest, för att skapa en uppsättning tester som utför alla möjliga alternativ och variationer i koden.

Använd satsparametrar och undvik sammanfogad (dynamiskt genererad) SQL
Om du använder parametrar, och undviker dynamiskt skapade SQL-satser, används samma SQL-satstext varje gång en sats körs. Detta innebär att det blir mycket enklare att testa dina satser och begränsa antalet möjliga varianter. Om du måste generera en SQL-sats dynamiskt bör du hålla de dynamiska delarna av satsen på ett minimum. Verifiera också alla användarindata noggrant så att de inte orsakar syntaxfel.

Vid återställning av ett syntaxfel krävs komplex logik för att programmet ska kunna undersöka en SQL-sats och korrigera syntaxen. Om du följer de föregående riktlinjerna för hur du förhindrar syntaxfel kan potentiella källor till SQL-syntaxfel identifieras i körningen med hjälp av koden. Informera användaren om återställningsåtgärder vid syntaxfel. Ange vad som måste korrigeras för att satsen ska köras korrekt.

Begränsningsfel

Begränsningsfel uppstår när data läggs till i en kolumn med en INSERT - eller UPDATE -sats. Det här felet uppstår om nya data bryter mot någon av de definierade begränsningarna för tabellen eller kolumnen. Möjliga begränsningar:

Unique-begränsning
Anger att det inte får finnas duplicerade värden i någon kolumn (gäller alla rader i en tabell). När flera kolumner kombineras i en unique-begränsning får inte heller kombinationen av värdena i dessa kolumner vara duplicerade. Alla rader måste med andra ord vara distinkta för en angiven unik kolumn (eller kolumner).

Primary key-begränsning
När det gäller vilka data som en begränsning tillåter eller inte tillåter är primary key-begränsningen identisk med en unique-begränsning.

Not null-begränsning
Anger att ett NULL -värde inte kan lagras i en enskild kolumn och att den kolumnen därför måste ha ett värde på varje rad.

Check-begränsning
Gör att du kan ange en godtycklig begränsning för en eller flera tabeller. En vanlig Check-begränsning är en regel som definierar att en kolumns värde måste ligga inom vissa gränser (till exempel att en numerisk kolumns värde måste vara större än 0). En annan vanlig typ av Check-begränsning anger relationerna mellan kolumnvärden (till exempel att en kolumns värde måste skilja sig från värdet för en annan kolumn på samma rad).

Data type-begränsning (kolumntillhörighet)
Körningen påtvingar datatypen för kolumnernas värden, och ett fel uppstår om det görs ett försök att lagra ett värde av felaktig typ i en kolumn. I många fall konverteras dock värden för att överensstämma med kolumnens deklarerade datatyp. Mer information finns i Arbeta med datatyper i databaser .

I körningen tillämpas inte begränsningar på värden för främmande nycklar. Med andra ord krävs inte värden för främmande nycklar för att matcha ett befintligt primärnyckelvärde.

Utöver fördefinierade begränsningstyper stöder körningens SQL-motor även användning av utlösare. En utlösare liknar en händelsehanterare. Det är en fördefinierad uppsättning instruktioner som utförs vid en viss åtgärd. En utlösare kan till exempel definieras så att den aktiveras när data infogas i eller tas bort från en viss tabell. En möjlig användning för en utlösare är att undersöka dataändringar och utlösa ett fel om de angivna villkoren inte uppfylls. En utlösare kan alltså fylla samma syfte som en begränsning, och strategierna för förebyggande och återställande åtgärder vid begränsningsfel gäller även för utlösargenererade fel. Fel-id för utlösargenererade fel skiljer sig däremot från begränsningsfelens fel-id.

Vilken uppsättning begränsningar som ska tillämpas på en viss tabell avgör du medan du utformar ett program. Tänk på att utforma begränsningarna så att programmet kan vidta förebyggande och återställande åtgärder vid begränsningsfel. Begränsningsfel är dock mycket svåra att systematiskt förutspå och förebygga. Begränsningsfelen är svåra att förutspå eftersom de inte uppstår förrän programdata läggs till. Begränsningsfel uppstår med data som läggs till i en databas efter att den har skapats. Dessa fel är ofta ett resultat av relationen mellan nya data och data som redan finns i databasen. Med följande strategier kan du undvika många begränsningsfel:

Planera noggrant databasens struktur och begränsningar
Syftet med begränsningarna är att tillämpa programregler och skydda integriteten för databasens data. När du planerar ditt program bör du fundera över hur du ska strukturera databasen så att den stöder programmet. I denna process ingår att identifiera regler för data, till exempel om vissa värden ska krävas, om ett värde ska ha ett standardvärde och om duplicerade värden ska vara tillåtna. Dessa regler ger en vägledning när du definierar begränsningar för databasen.

Ange kolumnnamn explicit
Du kan skriva en INSERT -sats utan att du explicit anger vilka kolumner värden ska infogas i, men det medför onödiga risker. Genom att explicit namnge kolumnerna som värdena ska infogas i, blir det möjligt att använda automatiskt genererade värden, kolumner med standardvärden och kolumner som tillåter NULL -värden. På så sätt kan du dessutom se till att ett explicit värde infogas i alla NOT NULL -kolumner.

Använd standardvärden
När du anger en NOT NULL -begränsning för en kolumn anger du ett standardvärde i kolumndefinitionen (om detta är möjligt). Det kan också finnas standardvärden i programkoden. Koden kan t.ex. kontrollera om en strängvariabel är null och tilldela den ett värde innan den används för att ange ett satsparametervärde.

Validera användarangivna data
Kontrollera användarangivna data i förväg för att säkerställa att de uppfyller de krav som anges i begränsningarna (gäller särskilt begränsningarna NOT NULL och CHECK ). Av naturliga skäl är begränsningen UNIQUE svårare att kontrollera eftersom en SELECT -fråga måste köras för att avgöra om aktuella data är unika.

Använd utlösare
Du kan skriva en utlösare som validerar (och eventuellt ersätter) infogade data eller vidtar andra åtgärder för att korrigera ogiltiga data. Med hjälp av en sådan validering och korrigering kan du förhindra att det uppstår begränsningsfel.

Begränsningsfel är på många sätt svårare att förebygga än andra typer av fel. Som tur är finns flera strategier för att göra en återställning vid begränsningsfel utan att programmet blir instabilt eller oanvändbart:

Använd konfliktalgoritmer
När du definierar en begränsning för en kolumn och när du skapar en INSERT - eller UPDATE -sats, kan du ange en konfliktalgoritm. En konfliktalgoritm definierar åtgärden som databasen vidtar när en överträdelse inträffar. Det finns flera möjliga åtgärder som databasmotorn kan vidta. Databasmotorn kan avsluta en enskild sats eller en hel transaktion. Den kan också ignorera felet. Den kan till och med ta bort gamla data och ersätta dem med data som koden försöker lagra.

Mer information finns i avsnittet "ON CONFLICT (konfliktalgoritmer)" i SQL-stöd i lokala databaser .

Ge korrigerande feedback
En uppsättning begränsningar som kan påverka ett visst SQL-kommando kan identifieras i förväg. Du kan alltså förutse begränsningsfel som en sats kan orsaka. Med den kunskapen kan du skapa programlogik som åtgärdar ett begränsningsfel. Anta till exempel att ett program innehåller ett inmatningsformulär för att ange nya produkter. Om produktnamnskolumnen i databasen definieras med en UNIQUE -begränsning skulle i så fall ett begränsningsfel uppstå om en ny produktrad infogades i databasen. Programmet är därmed utformat för att förutse begränsningsfel. När felet inträffar får användaren en varning om att det angivna produktnamnet redan används och uppmanas att välja ett annat namn. Det går också att låta användaren visa information om den andra produkten med samma namn.