Gegevens invoegen

Adobe AIR 1.0 of hoger

Voor het toevoegen van gegevens aan een database moet de SQL-instructie INSERT worden uitgevoerd. Nadat de instructie is uitgevoerd, hebt u toegang tot de primaire sleutel voor de zojuist ingevoegde rij als de sleutel door de database is gegenereerd.

INSERT-instructies uitvoeren

Als u gegevens wilt toevoegen aan een tabel in een database, moet u een SQLStatement -instantie maken en uitvoeren waarvan de tekst de SQL-instructie INSERT is.

In het volgende voorbeeld ziet u hoe u een SQLStatement-instantie gebruikt om een gegevensrij toe te voegen aan de bestaande tabel “employees”. Dit voorbeeld illustreert het invoegen van gegevens in asynchrone uitvoeringsmodus. Let op: deze vermelding ervan uit dat een SQLConnection -instantie met de naam conn al is gemaakt en met een database is verbonden. De code gaat er ook van uit dat de tabel “employees” al is gecreëerd.

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>

In het volgende voorbeeld ziet u hoe u een gegevensrij toevoegt aan de bestaande tabel “employees” in synchrone uitvoeringsmodus. Let op: deze vermelding ervan uit dat een SQLConnection -instantie met de naam conn al is gemaakt en met een database is verbonden. De code gaat er ook van uit dat de tabel “employees” al is gecreëerd.

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>

De door de database gegenereerde primaire sleutel van een ingevoegde rij ophalen

Vaak moet uw code na het invoegen van een gegevensrij in een tabel de door de database gegenereerde primaire sleutel of de rij-identificatiewaarde voor de zojuist ingevoegde rij weten. Nadat u een rij in één tabel hebt ingevoegd, wilt u bijvoorbeeld rijen toevoegen aan een gerelateerde tabel. In dat geval kunt u het best de waarde van de primaire sleutel als vreemde sleutel in de gerelateerde tabel invoegen. De primaire sleutel van de zojuist ingevoegde rij kan worden opgehaald via het SQLResult -object dat gekoppeld is aan het uitvoeren van de instructie. Dit object wordt ook gebruikt om resultaatgegevens te benaderen nadat de instructie SELECT is uitgevoerd. Net als bij alle andere SQL-instructies creëert de runtime na het voltooien van de instructie INSERT een SQLResult-instantie. U benadert de SQLResult-instantie door de methode getResult() van het SQLStatement -object aan te roepen als u een gebeurtenislistener of de synchrone uitvoeringsmodus gebruikt. Als u echter de asynchrone uitvoeringsmodus gebruikt en u een Responder -instantie doorgeeft aan de aanroep execute() , wordt de SQLResult-instantie als argument doorgegeven aan de resultaathandlerfunctie. In elk geval heeft de SQLResult-instantie de eigenschap lastInsertRowID , die de rij-identificator van de laatst ingevoegde rij bevat als de uitgevoerde SQL-instructie de instructie INSERT is.

In het volgende voorbeeld ziet u hoe u de primaire sleutel van een ingevoegde rij benadert in asynchrone uitvoeringsmodus:

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 
} 

In het volgende voorbeeld ziet u hoe u de primaire sleutel van een ingevoegde rij benadert in synchrone uitvoeringsmodus:

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 
} 

Let op: mogelijk heeft de rij-identificator de waarde van de kolom die in de tabeldefinitie is opgegeven als de kolom met de primaire sleutel. Hierbij gelden de volgende regels:

  • Als voor de tabel een kolom met de primaire sleutel is gedefinieerd waarbij de kolomgegevens van het type INTEGER zijn, bevat de eigenschap lastInsertRowID de waarde die in de desbetreffende rij is ingevoegd (of de waarde die door de runtime is gegenereerd als het een kolom van het type AUTOINCREMENT betreft).

  • Als voor de tabel meerdere kolommen met een primaire sleutel zijn gedefinieerd (een samengestelde sleutel) of als voor de tabel één kolom is gedefinieerd met een primaire sleutel waarbij de kolomgegevens niet van het type INTEGER zijn, genereert de database een onzichtbare integer als rij-identificatiewaarde voor de rij. Die gegenereerde waarde is de waarde van de eigenschap lastInsertRowID .

  • De waarde is altijd de rij-identificator van de laatst ingevoegde rij. Als de instructie INSERT een trigger activeert waardoor vervolgens een rij wordt ingevoegd, bevat de eigenschap lastInsertRowID de rij-identificator van de rij die het laatst door de trigger is ingevoegd en niet van de rij die door de instructie INSERT is gemaakt.

Dit betekent dat als u een kolom met een expliciet gedefinieerde primaire sleutel wilt waarvan de waarde beschikbaar is na de opdracht INSERT via de eigenschap SQLResult.lastInsertRowID , u de kolom moet definiëren als een kolom van het type INTEGER PRIMARY KEY . Zelfs als uw tabel geen expliciete kolom van het type INTEGER PRIMARY KEY bevat, is het geen probleem om de door de database gegenereerde rij-identificator als primaire sleutel voor uw tabel te gebruiken voor het definiëren van relaties met gerelateerde tabellen. De waarde van de kolom met de rij-identificator is in alle SQL-instructies beschikbaar door het gebruik van een van de speciale kolomnamen: ROWID , _ROWID_ of OID . U kunt in een gerelateerde tabel een kolom met een vreemde sleutel creëren en de rij-identificatiewaarde gebruiken als waarde voor de kolom met de vreemde sleutel, zoals bij een expliciet gedefinieerde kolom van het type INTEGER PRIMARY KEY . Als u dus een willekeurige primaire sleutel gebruikt in plaats van een natuurlijke sleutel en u het niet erg vindt dat de runtime de waarde van de primaire sleutel voor u genereert, is er geen groot verschil tussen het gebruik van een kolom van het type INTEGER PRIMARY KEY of van de door het systeem gegenereerde rij-identificator als primaire sleutel van de tabel bij het definiëren van een relatie met vreemde sleutel tussen twee tabellen.

Zie SQL-ondersteuning in lokale databases voor meer informatie over primaire sleutels en gegenereerde rij-id's.