Uso de operaciones sincrónicas de base de datos

Adobe AIR 1.0 y posterior

Existe una mínima diferencia en el código real que se usa para ejecutar y responder a las operaciones cuando usa la ejecución sincrónica, comparado con el código para el modo de ejecución asíncrono. Las diferencias principales entre los dos métodos se observan en dos áreas. La primera es la ejecución de una operación que depende de otra operación (como filas de resultados SELECT o la clave principal de la fila añadida por una declaración INSERT ). La segunda área de diferencia es en la gestión de errores.

Cómo escribir código para las operaciones sincrónicas

La diferencia principal entre la ejecución sincrónica y la ejecución asíncrona es que en el modo sincrónico se escribe el código como una sola serie de pasos. Por el contrario, en el código asíncrono se registran detectores de eventos y con frecuencia se dividen operaciones entre los métodos de detectores. Cuando una base de datos se conecta en el modo de ejecución sincrónico , se puede ejecutar una serie de operaciones de base de datos sucesivamente dentro de un solo bloque de código. En el siguiente ejemplo se demuestra 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 puede ver, se llama a los mismos métodos para realizar las operaciones de base de datos independientemente si utiliza la ejecución sincrónica o asíncrona. Las diferencias principales entre los dos métodos son ejecutar una operación que depende de otra operación y la gestión de errores.

Ejecución de una operación que depende de otra operación

Cuando utiliza el modo de ejecución sincrónico, no necesita escribir código que detecta un evento para determinar cuando se completa una operación. En cambio, puede suponer que si una operación en una línea de código se completa correctamente, la ejecución continúa con la siguiente línea de código. En consecuencia, para realizar una operación que depende del éxito de otra operación, simplemente escriba el código dependiente inmediatamente después de la operación de la que depende. Por ejemplo, para codificar una aplicación para que inicie una transacción, ejecute una declaración INSERT , recupere la clave principal de la fila insertada, inserte esa clave principal en otra fila de una tabla diferente y finalmente confirme la transacción, se puede escribir todo el código como una serie de declaraciones. En el siguiente ejemplo se demuestran estas operaciones:

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

Gestión de errores con la ejecución sincrónica

En el modo de ejecución sincrónico, no se detecta un evento de error para determinar que ha fallado una operación. En cambio, se rodea el código que podría desencadenar errores en un conjunto de bloques de código try..catch..finally . Se agrupa el código de emisión de error en el bloque try . Se escriben las acciones para realizar en respuesta a cada tipo de error en bloques catch por separado. Coloque el código que desea que siempre se ejecute independientemente del éxito o error (por ejemplo, cerrar una conexión de base de datos que ya no se necesita) en un bloque finally . En el siguiente ejemplo se demuestra el uso de los bloques try..catch..finally para la gestión de errores. Se basa en el ejemplo anterior añadiendo el código de gestión de error:

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