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-objektets getResult() -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 .