データの挿入

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 
} 

行識別子は、テーブル定義で主キー列として指定されている列の値である場合もあれば、そうでない場合もあります。これは次のルールによって決まります。

  • テーブルの定義で使用されている主キー列の類似性(列のデータ型)が INTEGER の場合は、その行に挿入された値( AUTOINCREMENT 列の場合にはランタイムによって生成された値)が lastInsertRowID プロパティに格納されます。

  • テーブルの定義で複数の主キー列(複合キー)が使用されている場合や、主キー列が 1 つでも親和型 INTEGER ではない場合は、その行の行識別子の整数値が背後で生成されます。その生成された値が lastInsertRowID プロパティの値になります。

  • この値は常に、直前に挿入された行の行識別子です。 INSERT ステートメントがトリガーを発生させて、その結果として行が挿入された場合は、 INSERT ステートメントによって作成された行ではなく、トリガーによって挿入された最後の行の行識別子が lastInsertRowID プロパティに格納されます。

これらのルールによって、 INSERT コマンドの実行後に SQLResult.lastInsertRowID プロパティを通じて値を取得できる、明示的に定義された主キー列が必要な場合は、その列を INTEGER PRIMARY KEY 列として定義する必要があります。明示的な INTEGER PRIMARY KEY 列がテーブルに含まれていなくても、関連テーブルとの関係を定義するという意味では、データベースによって生成される行識別子をテーブルの主キーとして使用しても何ら問題はありません。SQL ステートメントで行識別子列の値を取得するには、特殊な列名のいずれか( ROWID _ROWID_ 、または OID )を使用します。関連テーブルで外部キー列を作成して、行識別子の値を(明示的に宣言された INTEGER PRIMARY KEY 列の場合と同じように)その外部キー列の値として使用することもできます。その意味では、自然キーではなく恣意的な主キーを使用している場合に、主キー値がランタイムによって生成されても問題がなければ、2 つのテーブルの間の外部キー関係を定義するためのテーブルの主キーとして INTEGER PRIMARY KEY 列を使用しても、システム生成の行識別子を使用しても、ほとんど違いはありません。

主キーと生成された行識別子について詳しくは、 ローカルデータベースでの SQL サポート を参照してください。