Infoga data

Adobe AIR 1.0 och senare

När du hämtar data till en databas kör du en INSERT-sats (SQL). När satskörningen har slutförts kan du få åtkomst till primärnyckeln för den nyligen infogade raden om nyckeln genererades av databasen.

Köra en INSERT-sats

Om du vill lägga till data i en tabell i en databas skapar och kör du en SQLStatement-instans vars text är en INSERT-sats (SQL).

I följande exempel används en SQLStatement-instans för att lägga till en datarad i den befintliga tabellen ”employees”. I det här exemplet visas hur du infogar data i asynkront körningsläge. Observera att koden i det här exemplet innehåller en SQLConnection-instans med namnet conn som redan har initierats och är ansluten till en databas. I exemplet antas också att tabellen ”employees” redan har skapats.

import flash.data.SQLConnection; 
import flash.data.SQLResult; 
import flash.data.SQLStatement; 
import flash.events.SQLErrorEvent; 
import flash.events.SQLEvent; 
     
// ... create and open the SQLConnection instance named conn ... 
     
// create the SQL statement 
var insertStmt:SQLStatement = new SQLStatement(); 
insertStmt.sqlConnection = conn; 
     
// define the SQL text 
var sql:String =  
    "INSERT INTO employees (firstName, lastName, salary) " +  
    "VALUES ('Bob', 'Smith', 8000)"; 
insertStmt.text = sql; 
     
// register listeners for the result and failure (status) events 
insertStmt.addEventListener(SQLEvent.RESULT, insertResult); 
insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError); 
     
// execute the statement 
insertStmt.execute(); 
     
function insertResult(event:SQLEvent):void 
{ 
    trace("INSERT statement succeeded"); 
} 
     
function insertError(event:SQLErrorEvent):void 
{ 
    trace("Error message:", event.error.message); 
    trace("Details:", event.error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                // create the SQL statement 
                var insertStmt:SQLStatement = new SQLStatement(); 
                insertStmt.sqlConnection = conn; 
                 
                // define the SQL text 
                var sql:String =  
                    "INSERT INTO employees (firstName, lastName, salary) " +  
                    "VALUES ('Bob', 'Smith', 8000)"; 
                insertStmt.text = sql; 
                 
                // register listeners for the result and failure (status) events 
                insertStmt.addEventListener(SQLEvent.RESULT, insertResult); 
                insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError); 
                 
                // execute the statement 
                insertStmt.execute(); 
            } 
             
            private function insertResult(event:SQLEvent):void 
            { 
                trace("INSERT statement succeeded"); 
            } 
             
            private function insertError(event:SQLErrorEvent):void 
            { 
                trace("Error message:", event.error.message); 
                trace("Details:", event.error.details); 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

I följande exempel läggs en datarad till i den befintliga tabellen ”employees” i synkront körningsläge. Observera att koden i det här exemplet innehåller en SQLConnection-instans med namnet conn som redan har initierats och är ansluten till en databas. I exemplet antas också att tabellen ”employees” redan har skapats.

import flash.data.SQLConnection; 
import flash.data.SQLResult; 
import flash.data.SQLStatement; 
import flash.errors.SQLError; 
     
// ... create and open the SQLConnection instance named conn ... 
     
// create the SQL statement 
var insertStmt:SQLStatement = new SQLStatement(); 
insertStmt.sqlConnection = conn; 
     
// define the SQL text 
var sql:String =  
    "INSERT INTO employees (firstName, lastName, salary) " +  
    "VALUES ('Bob', 'Smith', 8000)"; 
insertStmt.text = sql; 
     
try 
{ 
    // execute the statement 
    insertStmt.execute(); 
     
    trace("INSERT statement succeeded"); 
} 
catch (error:SQLError) 
{ 
    trace("Error message:", error.message); 
    trace("Details:", error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                // create the SQL statement 
                var insertStmt:SQLStatement = new SQLStatement(); 
                insertStmt.sqlConnection = conn; 
                 
                // define the SQL text 
                var sql:String =  
                    "INSERT INTO employees (firstName, lastName, salary) " +  
                    "VALUES ('Bob', 'Smith', 8000)"; 
                insertStmt.text = sql; 
                 
                try 
                { 
                    // execute the statement 
                    insertStmt.execute(); 
                    trace("INSERT statement succeeded"); 
                } 
                catch (error:SQLError) 
                { 
                    trace("Error message:", error.message); 
                    trace("Details:", error.details); 
                } 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

Hämta en databasgenererad primärnyckel för en infogad rad

När du har infogat en datarad i en tabell måste koden ofta innehålla en databasgenererad primärnyckel eller ett radidentifierarvärde för den nyligen infogade raden. När du till exempel har infogat en rad i en tabell kanske du vill lägga till rader i en relaterad tabell. I så fall måste du infoga primärnyckelvärdet som en främmande nyckel i den relaterade tabellen. Primärnyckeln för en nyligen infogad rad kan hämtas med hjälp av det SQLResult-objekt som är associerat med satskörningen. Det här är samma objekt som används för att få åtkomst till resultatdata efter att en SELECT-sats har körts. Liksom med SQL-satser skapas en SQLResult-instans när körningen av en INSERT-sats har slutförts. Du får åtkomst till SQLResult-instansen genom att anropa SQLStatement-objektetsgetResult()-metod om du använder en händelselyssnare eller använder synkront körningsläge. Alternativt kan du använda asynkront körningsläge och skicka en Responder-instans till execute()-anropet, så att SQLResult-instansen skickas som ett argument till resultathanterarfunktionen. Oavsett vilket alternativ du väljer har SQLResult-instansen egenskapen lastInsertRowID, som innehåller radidentifieraren för den senast infogade raden, om SQL-satsen som kördes är en INSERT-sats.

I följande exempel visas hur du får åtkomst till primärnyckeln för en infogad rad i asynkront körningsläge:

insertStmt.text = "INSERT INTO ..."; 
     
insertStmt.addEventListener(SQLEvent.RESULT, resultHandler); 
     
insertStmt.execute(); 
     
function resultHandler(event:SQLEvent):void 
{ 
    // get the primary key 
    var result:SQLResult = insertStmt.getResult(); 
     
    var primaryKey:Number = result.lastInsertRowID; 
    // do something with the primary key 
} 

I följande exempel visas hur du får åtkomst till primärnyckeln för en infogad rad i synkront körningsläge:

insertStmt.text = "INSERT INTO ..."; 
     
try 
{ 
    insertStmt.execute(); 
     
    // get the primary key 
    var result:SQLResult = insertStmt.getResult(); 
     
    var primaryKey:Number = result.lastInsertRowID; 
    // do something with the primary key 
} 
catch (error:SQLError) 
{ 
    // respond to the error 
} 

Observera att radidentifieraren kan vara (eller inte vara) värdet för kolumnen som har angetts som primärnyckelkolumn i tabelldefinitionen enligt följande regler:

  • Om tabellen definieras med en primärnyckelkolumn vars tillhörighet (kolumndatatyp) är INTEGER innehåller egenskapen lastInsertRowID det värde som infogades i den raden (eller det värde som genererades i körningen om det är en AUTOINCREMENT-kolumn).

  • Om tabellen definieras med flera primärnyckelkolumner (en sammansatt nyckel) eller med en enskild primärnyckelkolumn vars tillhörighet inte är INTEGER, genereras ett radidentifierarvärde för raden bakom scenen. Det genererade värdet är värdet för egenskapen lastInsertRowID.

  • Värdet är alltid radidentifieraren för den senast infogade raden. Om en INSERT-sats aktiverar en utlösare, vilken i sin tur infogar en rad, kommer egenskapen lastInsertRowID att innehålla radidentifieraren för den senaste raden som infogats av utlösaren i stället för den rad som skapades av INSERT-satsen.

Om du som en konsekvens av de här reglerna vill ha en explicit definierad primärnyckelkolumn vars värde är tillgängligt efter ett INSERT-kommando via egenskapen SQLResult.lastInsertRowID, måste kolumnen definieras som en INTEGER PRIMARY KEY-kolumn. Men även om tabellen inte innehåller någon explicit INTEGER PRIMARY KEY-kolumn går det lika bra att använda den databasgenererade radidentifieraren som primärnyckel för tabellen när du definierar relationer med relaterade tabeller. Värdet för radidentifierarkolumnen är tillgängligt i alla SQL-satser när du använder något av kolumnnamnen ROWID, _ROWID_ eller OID. Du kan skapa en kolumn för främmande nyckel i en relaterad tabell och använda radidentifierarvärdet som kolumnvärde för främmande nyckel på samma sätt som du skulle ha gjort med en explicit deklarerad INTEGER PRIMARY KEY-kolumn. Om du använder en godtycklig primärnyckel i stället för en naturlig nyckel, och så länge du inte har något emot att primärnyckelvärdet genereras åt dig i körningen, blir det inte så stor skillnad om du använder en INTEGER PRIMARY KEY-kolumn eller den systemgenererade radidentifieraren som tabellens primärnyckel när du definierar en relation för främmande nyckel mellan två tabeller.

Mer information om primärnycklar och genererade radidentifierare finns i SQL-stöd i lokala databaser.