Verwenden von synchronen Datenbankoperationen

Adobe AIR 1.0 und höher

Der eigentliche Code, mit dem Operationen ausgeführt bzw. auf diese reagiert wird, unterscheidet sich im synchronen Ausführungsmodus kaum vom asynchronen Ausführungsmodus. Die Hauptunterschiede liegen in zwei Bereichen. Der erste betrifft das Ausführen einer Operation, die von einer anderen Operation abhängig ist (zum Beispiel SELECT -Ergebniszeilen oder der Primärschlüssel der Zeile, die mit einer INSERT -Anweisung hinzugefügt wurde). Der zweite Unterschied liegt im Umgang mit Fehlern.

Schreiben von Code für synchrone Operationen

Der Hauptunterschied zwischen der synchronen und asynchronen Ausführung besteht darin, dass Sie den Code im synchronen Modus als eine Reihe von Schritten schreiben. Im asynchronen Code registrieren Sie dagegen Ereignis-Listener und teilen Operationen häufig auf Listener-Methoden auf. Wenn eine Datenbank im synchronen Ausführungsmodus verbunden ist, können Sie innerhalb eines Codeblocks eine Reihe von Datenbankoperationen nacheinander ausführen. Diese Vorgehensweise wird im folgenden Beispiel veranschaulicht:

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

Sie sehen, dass Sie dieselben Methoden aufrufen, um Datenbankoperationen auszuführen, unabhängig vom Ausführungsmodus. Der Hauptunterschied zwischen den beiden Ansätzen besteht im Ausführen von Operationen, die von anderen Operationen abhängig sind, um im Umgang mit Fehlern.

Ausführen einer Operation, die von einer anderen Operation abhängig ist

Wenn Sie den synchronen Ausführungsmodus verwenden, brauchen Sie keinen Code zu schreiben, der auf ein Ereignis wartet, um festzustellen, ob eine Operation abgeschlossen ist. Sie können vielmehr davon ausgehen, dass die Ausführung der Anwendung mit der nächsten Codezeile fortgesetzt wird, wenn eine Operation in einer Codezeile erfolgreich abgeschlossen wurde. Um eine Operation auszuführen, die vom Erfolg einer anderen Operation abhängig ist, brauchen Sie den abhängigen Code also nur direkt nach der Operation, von der er abhängig ist, zu schreiben. Wenn Sie zum Beispiel eine Anwendung anweisen möchten, mit einer Transaktion zu beginnen, eine INSERT -Anweisung auszuführen, den Primärschlüssel der eingefügten Zeile abzurufen, diesen Primärschlüssel in eine andere Zeile einer anderen Tabelle einzufügen und die Transaktion abzuschließen, können Sie den gesamten Code als eine Reihe von Anweisungen schreiben. Diese Operationen werden im folgenden Beispiel veranschaulicht:

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

Umgang mit Fehlern im synchronen Ausführungsmodus

Im synchronen Ausführungsmodus warten Sie nicht auf ein Fehlerereignis, um festzustellen, dass eine Operation fehlgeschlagen ist. Stattdessen umgeben Sie jeden Code, der zu Fehlern führen könnte, mit einem Satz von try..catch..finally -Codeblöcken. Sie schließen den Fehler auslösenden Code in den try -Block ein. Schreiben Sie die Aktionen, die als Reaktion auf die einzelnen Fehlertypen ausgeführt werden sollen, in separate catch -Blöcke. Platzieren Sie den Code, den Sie unabhängig von Erfolg oder Fehlschlagen immer ausführen möchten (zum Beispiel Schließen einer nicht mehr benötigten Datenbankverbindung) in einen finally -Block. Im folgenden Beispiel wird die Verwendung eines try..catch..finally -Blocks zur Fehlerverarbeitung veranschaulicht. Es basiert auf dem vorherigen Beispiel und erweitert es, indem Fehlerverarbeitungscode hinzugefügt wird:

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