Różnica między kodem używanym do wykonywania i reagowania na operacje w trybie synchronicznym a kodem używanym w trybie asynchronicznym jest niewielka. Główne różnice między tymi podejściami są następujące. Pierwszą jest wykonywanie operacji, która jest uzależniona od innej operacji (np. wiersze wynikowe instrukcji
SELECT
lub klucz podstawowy wiersza dodawanego przez instrukcję
INSERT
). Drugą jest różnica w obsługiwaniu błędów.
Pisanie kodu operacji synchronicznych
Główną różnicą między wykonaniem synchronicznym i asynchronicznym jest to, że w trybie synchronicznym kod jest pisany jako seria kroków. W przypadku kodu asynchronicznego rejestrowane są detektory zdarzeń, a operacje często są rozdzielane między metody detektorów. Jeśli baza danych jest
podłączona w trybie wykonywania synchronicznego
, wówczas możliwe jest wykonanie kolejno serii operacji bazy danych za pomocą jednego bloku kodu. Poniższy przykład demonstruje tę technikę:
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();
Jak widać, te same metody są wywoływane w celu wykonania operacji bazy danych w trybie synchronicznym oraz asynchronicznym. Głównymi różnicami między tymi dwoma podejściami jest wykonywanie operacji, która jest uzależniona od innej operacji, a także obsługa błędów.
Wykonywanie operacji, która jest uzależniona od innej operacji
Jeśli używany jest tryb wykonywania synchronicznego, nie ma potrzeby pisania kodu, który będzie wykrywał zdarzenie w celu określenia, czy operacja została zakończona. Zamiast tego można przyjąć, że jeśli operacja w jednej linii kodu zakończy się pomyślnie, wykonywanie będzie kontynuowane od kolejnej linii kodu. W rezultacie w celu wykonania operacji, która jest uzależniona od powodzenia innej operacji, należy po prostu napisać zależny kod, który zostanie wykonany bezpośrednio po operacji, od której jest zależny. Na przykład: w celu zakodowania aplikacji w taki sposób, aby rozpoczęła transakcję, należy wykonać instrukcję
INSERT
, pobrać klucz podstawowy wstawionego wiersza, wstawić klucz podstawowy do innego wiersza w innej tabeli, a na koniec wykonać transakcję — kod można zapisać w postaci serii instrukcji. Poniższy przykład demonstruje te operacje:
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();
Obsługa błędów w wykonywaniu synchronicznym
W trybie wykonywania synchronicznego nie ma potrzeby wykrywania zdarzenia błędu w celu określenia, czy operacja się nie powiodła. Zamiast tego należy otoczyć każdy kod, który może powodować błędy w zestawie bloków kodu
try..catch..finally
. Kod powodujący błędy należy umieścić w bloku
try
. Operacje, jakie powinny być wykonywane w odpowiedzi na każdy typ błędu należy zapisać w osobnych blokach
catch
. Każdy kod, który ma być wykonywany bez względu na powodzenie lub niepowodzenie (np. zamknięcie połączenia z bazą danych, które nie jest już wymagane) należy umieścić w bloku
finally
. W poniższym przykładzie zaprezentowano zastosowanie bloków
try..catch..finally
dla obsługi błędów. W tym przykładzie wykorzystano poprzedni przykład oraz dodano kod obsługi błędów:
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();
}
|
|
|