Använda synkrona databasåtgärder

Adobe AIR 1.0 och senare

Den faktiska koden du använder för att köra och svara på åtgärder i synkront körningsläge skiljer sig inte mycket från den kod du använder i asynkront körningsläge. Det finns två huvudskillnader mellan de två lägena. Den ena skillnaden är när du kör en åtgärd som är beroende av en annan åtgärd (till exempel SELECT -resultatrader eller primärnyckeln för en rad som har lagts till med en INSERT -sats). Den andra skillnaden gäller felhantering.

Skriva kod för synkrona åtgärder

Den huvudsakliga skillnaden mellan synkron och asynkron körning är att du i synkront läge skriver koden som en serie steg. I asynkron kod aktiverar du händelselyssnare och delar ofta in åtgärderna i olika lyssnarmetoder. När en databas är ansluten i synkront körningsläge kan du köra en serie databasåtgärder i följd inom ett enskilt kodblock. Detta visas i följande exempel:

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(); 

Som du kan se anropar du samma metoder för att utföra databasåtgärder oavsett om du använder synkron eller asynkron körning. De huvudsakliga skillnaderna mellan de två lägena är när du kör en åtgärd som är beroende av en annan åtgärd och när du hanterar fel.

Köra en åtgärd som är beroende av en annan åtgärd

När du använder synkront körningsläge behöver du inte skriva kod som lyssnar efter en händelse för att avgöra när en åtgärd har slutförts. I stället kan du anta att när en åtgärd i en kodrad har slutförts fortsätter nästa kodrad att köras. När du vill använda en åtgärd som är beroende av att en annan åtgärd först slutförs, behöver du alltså bara skriva koden direkt efter åtgärden den är beroende av. Om du till exempel vill att ett program ska påbörja en transaktion, köra en INSERT -sats, hämta primärnyckeln för den infogade raden, infoga primärnyckeln i en annan rad i en annan tabell och slutligen utföra transaktionen, skriver du koden som en serie satser. I följande exempel visas dessa åtgärder:

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(); 

Hantera fel med synkron körning

I synkront körningsläge behöver du inte lyssna efter en felhändelse för att avgöra om en åtgärd har misslyckats. I stället omsluter du kod som skulle kunna utlösa fel i en uppsättning try..catch..finally -kodblock. Du omsluter den felgenererande koden i try -blocket. Skriv åtgärderna som ska utföras som svar på varje typ av fel i separata catch -block. Placera all kod som du vill ska köras oavsett om det uppstår ett fel eller inte (det kan till exempel gälla stängning av en databasanslutning som inte längre behövs) i ett finally -block. I följande exempel visas hur du använder try..catch..finally -block för felhantering. I det här exemplet (som bygger på föregående exempel) läggs felhanteringskod till:

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(); 
}