Uso de operações de banco de dados síncronas

Adobe AIR 1.0 e posterior

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