Einfügen von Daten

Adobe AIR 1.0 und höher

Zum Hinzufügen von Daten zu einer Datenbank muss eine SQL-Anweisung des Typs INSERT ausgeführt werden. Wenn die Ausführung der Anweisung abgeschlossen ist, können Sie auf den Primärschlüssel für die neu eingefügte Zeile zugreifen, falls der Schlüssel von der Datenbank generiert wurde.

Ausführen einer INSERT-Anweisung

Um einer Tabelle in einer Datenbank Daten hinzuzufügen, müssen Sie eine SQLStatement -Instanz erstellen und ausführen, deren Text eine SQL-Anweisung des Typs INSERT ist.

Im folgenden Beispiel wird eine SQLStatement-Instanz verwendet, um der bereits vorhandenen Tabelle „employees“ eine Datenzeile hinzuzufügen. Dieses Beispiel veranschaulicht das Hinzufügen von Daten im asynchronen Ausführungsmodus. Beachten Sie, dass in diesem Beispiel davon ausgegangen wird, dass eine SQLConnection -Instanz namens conn bereits instanziiert wurde und eine Verbindung mit der Datenbank besteht. Außerdem wird vorausgesetzt, dass die Tabelle „employees“ bereits erstellt wurde.

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>

Im folgenden Beispiel wird der bereits vorhandenen Tabelle „employees“ im synchronen Ausführungsmodus eine Datenzeile hinzugefügt. Beachten Sie, dass in diesem Beispiel davon ausgegangen wird, dass eine SQLConnection -Instanz namens conn bereits instanziiert wurde und eine Verbindung mit der Datenbank besteht. Außerdem wird vorausgesetzt, dass die Tabelle „employees“ bereits erstellt wurde.

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>

Abrufen eines von der Datenbank generierten Primärschlüssels einer eingefügten Zeile

Häufig benötigt der Code nach dem Einfügen einer Datenzeile in eine Tabelle einen von der Datenbank generierten Primärschlüssel oder Zeilenbezeichnerwert für die neu eingefügte Zeile. Nachdem Sie eine Zeile in eine Tabelle eingefügt haben, könnten Sie zum Beispiel Zeilen in eine verwandte Tabelle einfügen. In diesem Fall würden Sie den Primärschlüssel als Fremdschlüssel in die verwandte Tabelle einfügen. Der Primärschlüssel einer neu eingefügten Zeile kann mithilfe des SQLResult -Objekts abgerufen werden, das mit der Anweisungsausführung assoziiert ist. Dies ist dasselbe Objekt, mit dem auf Ergebnisdaten zugegriffen wird, nachdem eine SELECT -Anweisung ausgeführt wurde. Wie bei jeder SQL-Anweisung erstellt die Laufzeitumgebung eine SQLResult-Instanz, wenn die Ausführung einer INSERT -Anweisung abgeschlossen ist. Sie können auf die SQLResult-Instanz zugreifen, indem Sie für das SQLStatement -Objekt die getResult() -Methode aufrufen, wenn Sie einen Ereignis-Listener verwenden oder im synchronen Ausführungsmodus arbeiten. Wenn Sie im asynchronen Ausführungsmodus arbeiten und eine Responder -Instanz an den execute() -Aufruf übergeben, wird alternativ dazu die SQLResult-Instanz als Argument an die Ergebnisprozedurfunktion übergeben. In jedem Fall verfügt die SQLResult-Instanz über eine Eigenschaft, lastInsertRowID , die den Zeilenbezeichner der zuletzt eingefügten Zeile enthält, wenn die ausgeführte SQL-Anweisung eine INSERT -Anweisung ist.

Im folgenden Beispiel wird der Zugriff auf den Primärschlüssel einer eingefügten Zeile im asynchronen Ausführungsmodus veranschaulicht:

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 
} 

Im folgenden Beispiel wird der Zugriff auf den Primärschlüssel einer eingefügten Zeile im synchronen Ausführungsmodus veranschaulicht:

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 
} 

Beachten Sie, dass der Zeilenbezeichner der Wert der Spalte sein kann, die als Primärschlüsselspalte in der Tabellendefinition bestimmt wurde; dies muss aber nicht unbedingt der Fall sein. Es gelten die folgenden Regeln:

  • Wenn die Tabelle mit einer Primärschlüsselspalte definiert wurde, deren Affinität (Spaltendatentyp) INTEGER lautet, enthält die lastInsertRowID -Eigenschaft den Wert, der in diese Zeile eingefügt wurde (oder den Wert, der von der Laufzeitumgebung generiert wurde, wenn es sich um eine AUTOINCREMENT -Spalte handelt).

  • Wenn die Tabelle mit mehreren Primärschlüsselspalten definiert wurde (ein zusammengesetzter Schlüssel) oder mit einer Primärschlüsselspalte, deren Affinität nicht INTEGER lautet, generiert die Datenbank im Hintergrund einen ganzzahligen Zeilenbezeichnerwert für die Zeile. Dieser generierte Wert ist der Wert der lastInsertRowID -Eigenschaft.

  • Der Wert ist immer der Zeilenbezeichner der zuletzt eingefügten Zeile. Wenn eine INSERT -Anweisung einen Auslöser startet, der seinerseits eine Reihe einfügt, enthält die lastInsertRowID -Eigenschaft den Zeilenbezeichner der zuletzt vom Auslöser eingefügten Zeile und nicht die Zeile, die von der INSERT -Anweisung erstellt wurde.

Wenn Sie eine explizit definierte Primärschlüsselspalte haben möchten, deren Wert nach einem INSERT -Befehl über die SQLResult.lastInsertRowID -Eigenschaft verfügbar ist, müssen Sie die Spalte deshalb als INTEGER PRIMARY KEY -Spalte definieren. Selbst wenn Ihre Tabelle keine explizite INTEGER PRIMARY KEY -Spalte enthält, ist es dennoch möglich, den von der Datenbank generierten Zeilenbezeichner als Primärschlüssel für die Tabelle zu verwenden, wenn Sie Beziehungen zu verwandten Tabellen definieren. Der Spaltenwert des Zeilenbezeichners ist in jeder SQL-Anweisung verfügbar, indem einer der Sonderspaltennamen ROWID , _ROWID_ oder OID verwendet wird. Sie können in einer verwandten Tabelle eine Fremdschlüsselspalte erstellen und den Zeilenbezeichnerwert als Fremdschlüsselspaltenwert verwenden, wie Sie auch mit einer explizit deklarierten INTEGER PRIMARY KEY -Spalte vorgehen würden. Wenn Sie einen beliebigen Primärschlüssel anstelle eines natürlichen Schlüssels verwenden und wenn es Sie nicht stört, dass die Laufzeitumgebung den Primärschlüsselwert für Sie generiert, macht es wenig Unterschied, ob Sie eine INTEGER PRIMARY KEY -Spalte oder den vom System generierten Zeilenbezeichner als Primärschlüssel einer Tabelle verwenden, um eine Fremdschlüsselbeziehung zwischen zwei Tabellen zu definieren.

Weitere Informationen über Primärschlüssel und generierte Zeilenbezeichner finden Sie unter SQL-Unterstützung in lokalen Datenbanken .