Korzystanie z synchronicznych operacji bazy danych

Adobe AIR 1.0 i starsze wersje

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