データの挿入Adobe AIR 1.0 およびそれ以降 データベースにデータを追加する際には SQL INSERT ステートメントを実行します。ステートメントの実行が完了したら、新たに挿入された行の主キーにアクセスできます(データベースによってキーが生成された場合)。 INSERT ステートメントの実行データベースのテーブルにデータを追加するには、text プロパティが SQL INSERT ステートメントの SQLStatement インスタンスを作成して実行します。 次の例では、既に存在している employees テーブルに 1 行のデータを追加する SQLStatement インスタンスが使用されています。この例は、非同期実行モードを使用してデータを挿入する方法を示しています。このリストでは、conn という名前の SQLConnection インスタンスが既に作成されてデータベースに接続されていることと、「employees」テーブルが既に作成されていることを前提としています。 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>
次の例では、同期実行モードを使用して、既に存在する employees テーブルに 1 行のデータを追加しています。このリストでは、conn という名前の SQLConnection インスタンスが既に作成されてデータベースに接続されていることと、「employees」テーブルが既に作成されていることを前提としています。 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>
挿入された行の(データベースによって生成される)主キーの取得テーブルにデータの行を挿入した後に、新たに挿入された行の(データベースによって生成される)主キーや行識別子の値がコードで必要になることがよくあります。例えば、テーブルに行を挿入した後に関連テーブルの行を追加する場合は、主キー値を関連テーブルの外部キーとして挿入する必要があります。新たに挿入された行の主キーを取得するには、ステートメントの実行に関連した SQLResult オブジェクトを使用します。これは、SELECT ステートメントの実行後に結果データにアクセスするために使用するのと同じオブジェクトです。INSERT ステートメントの実行が完了すると、他の SQL ステートメントの場合と同様に SQLResult インスタンスが作成されます。その SQLResult インスタンスにアクセスするには、SQLStatement オブジェクトの getResult() メソッドを呼び出します(イベントリスナーを使用している場合と同期実行モードを使用している場合)。非同期実行モードを使用していて、execute() の呼び出しで Responder インスタンスを渡した場合は、その結果ハンドラー関数に SQLResult インスタンスが引数として渡されます。いずれの場合も、その SQLResult インスタンスの lastInsertRowID プロパティに、直前に挿入された行の行識別子が格納されています(実行された SQL ステートメントが INSERT ステートメントの場合)。 次の例は、挿入された行の主キーに非同期実行モードでアクセスする方法を示しています。 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
}
次の例は、挿入された行の主キーに同期実行モードでアクセスする方法を示しています。 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
}
行識別子は、テーブル定義で主キー列として指定されている列の値である場合もあれば、そうでない場合もあります。これは次のルールによって決まります。
これらのルールによって、INSERT コマンドの実行後に SQLResult.lastInsertRowID プロパティを通じて値を取得できる、明示的に定義された主キー列が必要な場合は、その列を INTEGER PRIMARY KEY 列として定義する必要があります。明示的な INTEGER PRIMARY KEY 列がテーブルに含まれていなくても、関連テーブルとの関係を定義するという意味では、データベースによって生成される行識別子をテーブルの主キーとして使用しても何ら問題はありません。SQL ステートメントで行識別子列の値を取得するには、特殊な列名のいずれか(ROWID、_ROWID_、または OID)を使用します。関連テーブルで外部キー列を作成して、行識別子の値を(明示的に宣言された INTEGER PRIMARY KEY 列の場合と同じように)その外部キー列の値として使用することもできます。その意味では、自然キーではなく恣意的な主キーを使用している場合に、主キー値がランタイムによって生成されても問題がなければ、2 つのテーブルの間の外部キー関係を定義するためのテーブルの主キーとして INTEGER PRIMARY KEY 列を使用しても、システム生成の行識別子を使用しても、ほとんど違いはありません。 主キーと生成された行識別子について詳しくは、ローカルデータベースでの SQL サポートを参照してください。 |
|