Há pouca diferente no código que você usa para executar e responder a operações na execução síncrona em comparação com o código para o modo de execução assíncrona. As principais diferenças entre as duas abordagens estão em duas áreas. A primeira é executar uma operação que depende de outra operação (como linhas de resultado
SELECT
ou a chave primária da linha adicionada por uma instrução
INSERT
). A segunda área de diferença é o tratamento de erros.
Criação de código para operações síncronas
A principal diferença entre a execução síncrona e assíncrona é que, no modo síncrono, você cria o código como uma única série de etapas. Por outro lado, no código assíncrono, você registra ouvintes de evento e com frequência divide as operações entre métodos de ouvinte. Quando um banco de dados é
conectado no modo de execução síncrona
, você pode executar uma série de operações de banco de dados em sequência em um único bloco de código. O exemplo abaixo demonstra esta técnica:
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();
Como você pode ver, é possível chamar os mesmos métodos para executar operações de banco de dados independentemente de usar a execução síncrona ou assíncrona. As principais diferenças entre as duas abordagens são executar uma operação que depende de outra operação e como tratar de erros.
Execução de uma operação que depende de outra
Quando você usa o modo de execução síncrona, não precisa criar um código que monitore um evento para determinar quando uma operação é concluída. Em vez disso, você pode presumir que, se uma operação em uma linha de código foi concluída com sucesso, a execução continuará na próxima linha de código. Consequentemente, para executar uma operação que depende do sucesso de outra, basta criar o código dependente logo depois da operação da qual ela depende. Por exemplo, para codificar um aplicativo para iniciar uma transação, executar uma instrução
INSERT
, recuperar a chave primária da linha inserida, inserir essa chave primária em outra linha de uma outra tabela e, por fim, confirmar a transação, o código pode ser todo criado como uma série de instruções. O seguinte exemplo demonstra essas operações:
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();
Tratamento de erros na execução síncrona
No modo de execução síncrona, você não monitora um evento de erro para determinar se uma operação falhou. Em vez disso, coloque qualquer código que possa disparar erros em um conjunto de blocos de código
try..catch..finally
. Coloque o código gerador de erro no bloco
try
. Grave as ações a serem executadas em resposta a cada tipo de erro em blocos
catch
separados. Coloque qualquer código que você queira sempre executar independentemente de sucesso ou falha (por exemplo, encerrar uma conexão de banco de dados não mais necessária) em um bloco
finally
. O exemplo a seguir demonstra o uso de blocos
try..catch..finally
para tratamento de erros. Ele aproveita o exemplo anterior adicionando código de tratamento de erro:
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();
}
|
|
|