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