データの挿入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 サポートを参照してください。 |
|