Использование синхронных операций базы данных

Adobe AIR 1.0 и более поздних версий

Код, используемый для выполнения операций и реагирования на них при синхронном выполнении, мало отличается от кода, используемого при режиме асинхронного выполнения. Существует два ключевых отличия одного подхода от второго. Первое отличие заключается в выполнении операции, которая зависит от другой операции (например, строки результатов, полученные посредством инструкции SELECT , или первичный ключ строки, добавленной при помощи инструкции INSERT ). Второе отличие связано с обработкой ошибок.

Написание кода для синхронных операций

Ключевым отличием синхронного выполнения от асинхронного является то, что код для синхронного режима представляет собой единую последовательность шагов. В асинхронном режиме, наоборот, регистрируются прослушиватели событий и операции часто распределяются по методам прослушивателей. Когда база данных подключена в синхронном режиме , можно выполнить несколько операций базы данных подряд в одном блоке кода. Следующий пример иллюстрирует такой подход:

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

Как вы видите, одни и те же методы вызываются для выполнения операций базы данных независимо от использования синхронного или асинхронного режима. Основными отличиями одного подхода от другого является выполнение операции, которая зависит от другой операции, и обработка ошибок.

Выполнение операции, зависящей от другой операции

В режиме синхронного выполнения нет необходимости составлять код, прослушивающий события, чтобы определить завершение операции. Вместо этого предполагается, что при успешном завершении операции в одной строке кода начинает выполняться операция в следующей строке. Следовательно, чтобы выполнить операцию, зависящую от успешного выполнения предыдущей операции, нужно написать зависимый код непосредственно после операции, от которой он зависит. Например, код приложения, включающий в себя начало транзакции, выполнение инструкции INSERT , получение первичного ключа вставленной строки, вставку первичного ключа в строку другой таблицы и фиксацию транзакции, может представлять собой последовательность инструкций. Следующий пример иллюстрирует эти операции:

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

Обработка ошибок в синхронном режиме

В режиме синхронного выполнения нет необходимости прослушивать события ошибок для определения сбоя операции. Вместо этого нужно заключить код, который может привести к возникновению ошибок, в блоки кода try..catch..finally . Код, выдающий ошибку, заключается в блок try . Действия, выполняемые в ответ на каждый тип ошибки, заключаются в отдельный блок catch . Код, который выполняется независимо от успешного или неудачного выполнения операции (например, закрытие ненужного подключения к базе данных), заключается в блок finally . Следующий пример иллюстрирует использование блоков try..catch..finally для устранения ошибок. Он построен на предыдущем примере с добавлением кода обработки ошибок:

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