Код, используемый для выполнения операций и реагирования на них при синхронном выполнении, мало отличается от кода, используемого при режиме асинхронного выполнения. Существует два ключевых отличия одного подхода от второго. Первое отличие заключается в выполнении операции, которая зависит от другой операции (например, строки результатов, полученные посредством инструкции
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();
}
|
|
|