Synchrone databasebewerkingen gebruiken

Adobe AIR 1.0 of hoger

Op het gebied van de daadwerkelijke code die u gebruikt om bewerkingen uit te voeren en erop te reageren, is er niet veel verschil tussen de synchrone en asynchrone uitvoeringsmodus. De belangrijkste verschillen tussen beide modi liggen in twee gebieden. Het eerste verschil is de uitvoering van een bewerking die afhankelijk is van een andere bewerking (bijvoorbeeld rijen die het resultaat zijn van SELECT of de primaire sleutel van de rij die is toegevoegd door de instructie INSERT ). Het tweede verschil is de verwerking van fouten.

Code schrijven voor synchrone bewerkingen

Het belangrijkste verschil tussen synchrone en asynchrone uitvoering is dat u in de synchrone modus de code als één reeks van stappen schrijft. In de asynchrone modus registreert u gebeurtenislisteners en verdeelt u vaak bewerkingen over verschillende listenermethoden. Als een database in de synchrone uitvoeringsmodus is verbonden , kunt u een reeks van opeenvolgende databasebewerkingen binnen één codeblok laten uitvoeren. Deze techniek wordt in het volgende voorbeeld getoond:

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

Zoals u ziet, roept u dezelfde methoden op om databasebewerkingen uit te voeren, ongeacht de modus die u gebruikt (synchroon of asynchroon). De belangrijkste verschillen tussen beide modi zijn de uitvoering van een bewerking die afhankelijk is van een andere bewerking, en de verwerking van fouten.

Bewerkingen uitvoeren die afhankelijk zijn van een andere bewerking

In de synchrone uitvoeringsmodus hoeft u geen code te schrijven die op een gebeurtenis wacht om te bepalen wanneer een bewerking is voltooid. U mag ervan uitgaan dat als een bewerking op een bepaalde regel van de code is voltooid, de uitvoering verdergaat met de volgende regel. Dit betekent dat als u een bewerking wilt uitvoeren die afhankelijk is van de voltooiing van een andere bewerking, u gewoon de afhankelijke code onmiddellijk na de bewerking schrijft waarvan deze afhankelijk is. Als u bijvoorbeeld wilt dat een toepassing een transactie start, de instructie INSERT uitvoert, de primaire sleutel van de ingevoegde rij ophaalt, die primaire sleutel op een andere rij van een andere tabel invoegt en ten slotte de transactie bevestigt, kunt u de complete code als een reeks van instructies schrijven. In het volgende voorbeeld ziet u het gebruik van deze bewerkingen:

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

Fouten verwerken in synchrone uitvoeringsmodus

In de synchrone uitvoeringsmodus wacht u niet op een foutgebeurtenis om te bepalen of een bewerking is mislukt. In plaats daarvan plaatst u code die fouten kan veroorzaken in een set codeblokken van het type try..catch..finally . Plaats de code die de fout kan genereren in het blok try . Schrijf de acties die als reactie op de verschillende fouttypen moeten worden uitgevoerd in aparte blokken van het type catch . Plaats eventuele code die u altijd wilt uitvoeren ongeacht het resultaat (bijvoorbeeld het sluiten van een databaseverbinding die u niet meer nodig hebt) in een blok van het type finally . In het volgende voorbeeld ziet u hoe u blokken van het type try..catch..finally voor foutverwerking gebruikt. Dit voorbeeld is gebaseerd op het vorige voorbeeld maar voegt code voor foutverwerking toe:

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