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
.
|
|
|