同期データベース操作の使用

Adobe AIR 1.0 およびそれ以降

同期実行を使用する場合に操作の実行や応答のために使用する実際のコードは、非同期実行モードのコードとほとんど変わりません。この 2 つのアプローチの主な違いは 2 つの領域に分類できます。1 つは別の操作に依存する操作の実行( SELECT の結果行や、 INSERT ステートメントによって追加された行の主キーなど)、もう 1 つはエラー処理です。

同期操作のためのコードの記述

同期実行と非同期実行の主な違いとして、同期モードではコードを一続きのステップとして記述するのに対し、非同期コードではイベントリスナーを登録し、たいていは操作を複数のリスナーメソッドに分割します。データベースが 同期実行モードで接続されている 場合は、一連のデータベース操作を 1 つのコードブロックで連続して実行できます。次の例は、この方法を示しています。

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, OpenMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
// add the customer record to the database 
var insertCustomer:SQLStatement = new SQLStatement(); 
insertCustomer.sqlConnection = conn; 
insertCustomer.text = 
    "INSERT INTO customers (firstName, lastName) " +  
    "VALUES ('Bob', 'Jones')"; 
insertCustomer.execute(); 
     
var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
// add a related phone number record for the customer 
var insertPhoneNumber:SQLStatement = new SQLStatement(); 
insertPhoneNumber.sqlConnection = conn; 
insertPhoneNumber.text =  
    "INSERT INTO customerPhoneNumbers (customerId, number) " +  
    "VALUES (:customerId, '800-555-1234')"; 
insertPhoneNumber.parameters[":customerId"] = customerId; 
insertPhoneNumber.execute(); 
     
// commit the transaction 
conn.commit(); 

この例からわかるように、同期実行と非同期実行のどちらを使用する場合も、データベース操作を実行するために呼び出すメソッドは同じです。この 2 つのアプローチの主な違いは、別の操作に依存する操作の実行とエラー処理にあります。

別の操作に依存する操作の実行

同期実行モードを使用する場合は、操作の完了を確認するためにイベントをリッスンするコードを記述する必要はなく、コードの前の行の操作が正常に完了するとコードの次の行が実行されるものと考えることができます。したがって、別の操作の成功に依存する操作を実行するには、その操作のコードを依存する操作の直後に記述するだけで済みます。例えば、アプリケーションでトランザクションを開始して、 INSERT ステートメントを実行し、挿入した行の主キーを取得して、その主キーを別のテーブルの別の行に挿入した後、最後にトランザクションをコミットするコードを記述する場合、これらすべてのコードを一続きのステートメントとして記述できます。これらの操作を実行する例を以下に示します。

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, SQLMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
// add the customer record to the database 
var insertCustomer:SQLStatement = new SQLStatement(); 
insertCustomer.sqlConnection = conn; 
insertCustomer.text = 
    "INSERT INTO customers (firstName, lastName) " +  
    "VALUES ('Bob', 'Jones')"; 
insertCustomer.execute(); 
     
var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
// add a related phone number record for the customer 
var insertPhoneNumber:SQLStatement = new SQLStatement(); 
insertPhoneNumber.sqlConnection = conn; 
insertPhoneNumber.text =  
    "INSERT INTO customerPhoneNumbers (customerId, number) " +  
    "VALUES (:customerId, '800-555-1234')"; 
insertPhoneNumber.parameters[":customerId"] = customerId; 
insertPhoneNumber.execute(); 
     
// commit the transaction 
conn.commit(); 

同期実行でのエラー処理

同期実行モードでは、操作の失敗を確認するためにエラーイベントをリッスンする代わりに、エラーをトリガーする可能性があるコードを try..catch..finally コードブロックで囲みます。エラーをスローするコードを try ブロックでラップし、それぞれの種類のエラーに対して実行するアクションを個別の catch ブロックに記述して、操作が成功したか失敗したかに関係なく常に実行するコード(不要になったデータベース接続を閉じるコードなど)を finally ブロックに配置します。エラー処理のために try..catch..finally ブロックを使用する例を以下に示します。この例は、前の例にエラー処理のコードを追加したものです。

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, SQLMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
try 
{ 
    // add the customer record to the database 
    var insertCustomer:SQLStatement = new SQLStatement(); 
    insertCustomer.sqlConnection = conn; 
    insertCustomer.text = 
        "INSERT INTO customers (firstName, lastName)" +  
        "VALUES ('Bob', 'Jones')"; 
     
    insertCustomer.execute(); 
     
    var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
    // add a related phone number record for the customer 
    var insertPhoneNumber:SQLStatement = new SQLStatement(); 
    insertPhoneNumber.sqlConnection = conn; 
    insertPhoneNumber.text =  
        "INSERT INTO customerPhoneNumbers (customerId, number)" +  
        "VALUES (:customerId, '800-555-1234')"; 
    insertPhoneNumber.parameters[":customerId"] = customerId; 
     
    insertPhoneNumber.execute(); 
     
    // if we've gotten to this point without errors, commit the transaction 
    conn.commit(); 
} 
catch (error:SQLError) 
{ 
    // rollback the transaction 
    conn.rollback(); 
}