Om asynkront körningsläge

Adobe AIR 1.0 och senare

Ett vanligt missförstånd om asynkron körning är att det inte går att påbörja en körning av en SQLStatement-instans om det redan körs en annan SQLStatement-instans mot samma databasanslutning. Detta antagande är felaktigt. Du kan inte ändra text-egenskapen för satsen medan en SQLStatement-instans körs. Men om du däremot använder en separat SQLStatement-instans för varje SQL-sats som du vill köra kan du anropa execute()-metoden för en SQLStatement-instans medan en annan SQLStatement-instans fortfarande körs, utan att det uppstår något fel.

När du kör databasåtgärder internt i asynkront körningsläge har varje databasanslutning (varje SQLConnection-instans) en egen kö eller lista med åtgärder som den har instruerats att utföra. Varje åtgärd körs i följd, i den ordning de har lagts till i kön. När du skapar en SQLStatement-instans och anropar dess execute()-metod läggs satskörningsåtgärden till i kön för anslutningen. Om ingen åtgärd redan körs på SQLConnection-instansen börjar satsen köras i bakgrunden. Anta att du i samma kodblock skapar en annan SQLStatement-instans och också anropar den metodens execute()-metod. Den andra satskörningsåtgärden läggs i så fall till efter den första satsen i kön. När den första satsen har slutförts körs nästa åtgärd i kön. Bearbetningen av efterföljande åtgärder i kön utförs i bakgrunden, även när result-händelsen för den första åtgärden skickas i huvudprogramkoden. Den här tekniken visas i följande kod:

// Using asynchronous execution mode 
var stmt1:SQLStatement = new SQLStatement(); 
stmt1.sqlConnection = conn; 
     
// ... Set statement text and parameters, and register event listeners ... 
     
stmt1.execute(); 
     
// At this point stmt1's execute() operation is added to conn's execution queue. 
     
var stmt2:SQLStatement = new SQLStatement(); 
stmt2.sqlConnection = conn; 
     
// ... Set statement text and parameters, and register event listeners ... 
     
stmt2.execute(); 
     
// At this point stmt2's execute() operation is added to conn's execution queue. 
// When stmt1 finishes executing, stmt2 will immediately begin executing  
// in the background. 

Det finns en viktig sidoeffekt av att efterföljande satser i kön körs automatiskt. Om en sats är beroende av resultatet av en annan åtgärd kan du inte lägga till satsen i kön (du kan med andra ord inte anropa dess execute()-metod) förrän den första åtgärden har slutförts. Det beror på att när du väl har anropat den andra satsens execute()-metod kan du inte ändra satsens text- eller parameters-egenskaper. I så fall måste du vänta på händelsen som anger att den första åtgärden har slutförts innan du kan påbörja nästa åtgärd. Om du t. ex. vill köra en sats i överföringskontext är satskörningen beroende av åtgärden som öppnar transaktionen. När du har öppnat transaktionen genom att anropa metoden SQLConnection.begin() måste du vänta tills SQLConnection-instansen har skickat en begin-händelse. Du kan inte anropa SQLStatement-instansens execute()-metod förrän händelsen har skickats. I det här exemplet är det enklaste sättet att organisera programmet för att säkerställa att åtgärderna körs korrekt att skapa en metod som är registrerad som en lyssnare för begin-händelsen. Koden som ska anropa metoden SQLStatement.execute() placeras inom den lyssnarmetoden.