Hämta data från en databas

Adobe AIR 1.0 och senare

Du hämtar data från en databas i två steg. Först kör du en SELECT -sats (SQL), som beskriver datamängden du vill hämta från databasen. Sedan kan du visa eller ändra hämtade data efter behov.

Köra en SELECT-sats

Om du vill hämta befintliga data från en databas använder du en SQLStatement -instans. Tilldela lämplig SELECT -sats (SQL) till instansens text -egenskap och anropa sedan dess execute() -metod.

Mer information om syntaxen för satsen SELECT finns i SQL-stöd i lokala databaser .

Följande exempel visar hur SELECT -satsen körs för att hämta data från en tabell som heter “products,” med asynkront körningsläge:

var selectStmt:SQLStatement = new SQLStatement(); 
     
// A SQLConnection named "conn" has been created previously 
selectStmt.sqlConnection = conn; 
     
selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
     
selectStmt.addEventListener(SQLEvent.RESULT, resultHandler); 
selectStmt.addEventListener(SQLErrorEvent.ERROR, errorHandler); 
     
selectStmt.execute(); 
     
function resultHandler(event:SQLEvent):void 
{ 
    var result:SQLResult = selectStmt.getResult(); 
     
    var numResults:int = result.data.length; 
    for (var i:int = 0; i < numResults; i++) 
    { 
        var row:Object = result.data[i]; 
        var output:String = "itemId: " + row.itemId; 
        output += "; itemName: " + row.itemName; 
        output += "; price: " + row.price; 
        trace(output); 
    } 
} 
     
function errorHandler(event:SQLErrorEvent):void 
{ 
    // Information about the error is available in the 
    // event.error property, which is an instance of  
    // the SQLError class. 
}
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                var selectStmt:SQLStatement = new SQLStatement(); 
                 
                // A SQLConnection named "conn" has been created previously 
                selectStmt.sqlConnection = conn; 
                 
                selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
                 
                selectStmt.addEventListener(SQLEvent.RESULT, resultHandler); 
                selectStmt.addEventListener(SQLErrorEvent.ERROR, errorHandler); 
                 
                selectStmt.execute(); 
            } 
             
            private function resultHandler(event:SQLEvent):void 
            { 
                var result:SQLResult = selectStmt.getResult(); 
                 
                var numResults:int = result.data.length; 
                for (var i:int = 0; i < numResults; i++) 
                { 
                    var row:Object = result.data[i]; 
                    var output:String = "itemId: " + row.itemId; 
                    output += "; itemName: " + row.itemName; 
                    output += "; price: " + row.price; 
                    trace(output); 
                } 
            } 
             
            private function errorHandler(event:SQLErrorEvent):void 
            { 
                // Information about the error is available in the 
                // event.error property, which is an instance of  
                // the SQLError class. 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

Följande exempel visar hur SELECT -satsen körs för att hämta data från en tabell som heter “products,” med synkront körningsläge:

var selectStmt:SQLStatement = new SQLStatement(); 
     
// A SQLConnection named "conn" has been created previously 
selectStmt.sqlConnection = conn; 
     
selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
     
try 
{ 
    selectStmt.execute(); 
     
    var result:SQLResult = selectStmt.getResult(); 
     
    var numResults:int = result.data.length; 
    for (var i:int = 0; i < numResults; i++) 
    { 
        var row:Object = result.data[i]; 
        var output:String = "itemId: " + row.itemId; 
        output += "; itemName: " + row.itemName; 
        output += "; price: " + row.price; 
        trace(output); 
    } 
} 
catch (error:SQLError) 
{ 
    // Information about the error is available in the 
    // error variable, which is an instance of  
    // the SQLError class. 
}
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                var selectStmt:SQLStatement = new SQLStatement(); 
                 
                // A SQLConnection named "conn" has been created previously 
                selectStmt.sqlConnection = conn; 
                 
                selectStmt.text = "SELECT itemId, itemName, price FROM products"; 
                 
                try 
                { 
                    selectStmt.execute(); 
                     
                    var result:SQLResult = selectStmt.getResult(); 
                     
                    var numResults:int = result.data.length; 
                    for (var i:int = 0; i < numResults; i++) 
                    { 
                        var row:Object = result.data[i]; 
                        var output:String = "itemId: " + row.itemId; 
                        output += "; itemName: " + row.itemName; 
                        output += "; price: " + row.price; 
                        trace(output); 
                    } 
                } 
                catch (error:SQLError) 
                { 
                    // Information about the error is available in the 
                    // error variable, which is an instance of  
                    // the SQLError class. 
                } 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

När satskörningen har slutförts i asynkront körningsläge skickar SQLStatement-instansen en result -händelse ( SQLEvent.RESULT ) som anger att satsen har körts utan fel. Om ett Responder -objekt i stället skickas som ett argument till metoden execute() anropas Responder-objektets resultathanterarfunktion. I synkront körningsläge pausas körningen tills execute() -åtgärden har slutförts. Sedan återupptas körningen på nästa rad i koden.

Få åtkomst till resultatdata för en SELECT-sats

När SELECT -satsen har körts är nästa steg att få åtkomst till de data som har hämtats. Du hämtar resultatdata från körning av en SELECT -sats genom att anropa SQLStatement-objektets getResult() -metod:

var result:SQLResult = selectStatement.getResult();

Metoden getResult() returnerar ett SQLResult -objekt. SQLResult-objektets egenskap data är en array som innehåller resultaten från satsen SELECT :

var numResults:int = result.data.length; 
for (var i:int = 0; i < numResults; i++) 
{ 
    // row is an Object representing one row of result data 
    var row:Object = result.data[i]; 
}

Varje datarad i resultatmängden SELECT blir en Object-instans i arrayen data . Detta objekt har egenskaper vilkas namn matchar resultatmängdens kolumnnamn. Egenskaperna innehåller värden från resultatmängdens kolumner. Anta till exempel att SELECT -satsen anger en resultatmängd med tre kolumner som heter ”itemId”, ”itemName” och ”price”. För varje rad i resultatmängden skapas en objektinstans med egenskaper som får namnen itemId , itemName och price . Dessa egenskaper innehåller värden från sina respektive kolumner.

I följande kodexempel definieras en SQLStatement-instans vars text är en SELECT -sats. Satsen hämtar rader som innehåller firstName - och lastName -kolumnvärden för alla rader i en tabell med namnet employees . I det här exemplet används asynkront körningsläge. När körningen har slutförts anropas metoden selectResult() , och du får åtkomst till resulterande datarader med SQLStatement.getResult() och visar dem med metoden trace() . Observera att koden i det här exemplet innehåller en SQLConnection-instans med namnet conn som redan har initierats och är ansluten till databasen. I exemplet antas också att tabellen ”employees” redan har skapats och fyllts i med data.

import flash.data.SQLConnection; 
import flash.data.SQLResult; 
import flash.data.SQLStatement; 
import flash.events.SQLErrorEvent; 
import flash.events.SQLEvent; 
     
// ... create and open the SQLConnection instance named conn ... 
     
// create the SQL statement 
var selectStmt:SQLStatement = new SQLStatement(); 
selectStmt.sqlConnection = conn; 
     
// define the SQL text 
var sql:String =  
    "SELECT firstName, lastName " +  
    "FROM employees"; 
selectStmt.text = sql; 
     
// register listeners for the result and error events 
selectStmt.addEventListener(SQLEvent.RESULT, selectResult); 
selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError); 
     
// execute the statement 
selectStmt.execute(); 
     
function selectResult(event:SQLEvent):void 
{ 
    // access the result data 
    var result:SQLResult = selectStmt.getResult(); 
     
    var numRows:int = result.data.length; 
    for (var i:int = 0; i < numRows; i++) 
    { 
        var output:String = ""; 
        for (var columnName:String in result.data[i]) 
        { 
            output += columnName + ": " + result.data[i][columnName] + "; "; 
        } 
        trace("row[" + i.toString() + "]\t", output); 
    } 
} 
     
function selectError(event:SQLErrorEvent):void 
{ 
    trace("Error message:", event.error.message); 
    trace("Details:", event.error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.events.SQLErrorEvent; 
            import flash.events.SQLEvent; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                // create the SQL statement 
                var selectStmt:SQLStatement = new SQLStatement(); 
                selectStmt.sqlConnection = conn; 
                 
                // define the SQL text 
                var sql:String =  
                    "SELECT firstName, lastName " +  
                    "FROM employees"; 
                selectStmt.text = sql; 
                 
                // register listeners for the result and error events 
                selectStmt.addEventListener(SQLEvent.RESULT, selectResult); 
                selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError); 
                 
                // execute the statement 
                selectStmt.execute(); 
            } 
             
            private function selectResult(event:SQLEvent):void 
            { 
                // access the result data 
                var result:SQLResult = selectStmt.getResult(); 
                 
                var numRows:int = result.data.length; 
                for (var i:int = 0; i < numRows; i++) 
                { 
                    var output:String = ""; 
                    for (var columnName:String in result.data[i]) 
                    { 
                        output += columnName + ": " + result.data[i][columnName] + "; "; 
                    } 
                    trace("row[" + i.toString() + "]\t", output); 
                } 
            } 
             
            private function selectError(event:SQLErrorEvent):void 
            { 
                trace("Error message:", event.error.message); 
                trace("Details:", event.error.details); 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

I följande kodexempel visas samma tekniker som i föregående exempel, men i synkront körningsläge. I exemplet definieras en SQLStatement -instans vars text är en SELECT -sats. Satsen hämtar rader som innehåller firstName - och lastName -kolumnvärden för alla rader i en tabell med namnet employees . Du får åtkomst till de resulterande dataraderna med SQLStatement.getResult() och visar dem med metoden trace() . Observera att koden i det här exemplet innehåller en SQLConnection-instans med namnet conn som redan har initierats och är ansluten till databasen. I exemplet antas också att tabellen ”employees” redan har skapats och fyllts i med data.

import flash.data.SQLConnection; 
import flash.data.SQLResult; 
import flash.data.SQLStatement; 
import flash.errors.SQLError; 
     
// ... create and open the SQLConnection instance named conn ... 
     
// create the SQL statement 
var selectStmt:SQLStatement = new SQLStatement(); 
selectStmt.sqlConnection = conn; 
     
// define the SQL text 
var sql:String =  
    "SELECT firstName, lastName " +  
    "FROM employees"; 
selectStmt.text = sql; 
     
try 
{ 
    // execute the statement 
    selectStmt.execute(); 
     
    // access the result data 
    var result:SQLResult = selectStmt.getResult(); 
     
    var numRows:int = result.data.length; 
    for (var i:int = 0; i < numRows; i++) 
    { 
        var output:String = ""; 
        for (var columnName:String in result.data[i]) 
        { 
            output += columnName + ": " + result.data[i][columnName] + "; "; 
        } 
        trace("row[" + i.toString() + "]\t", output); 
    } 
} 
catch (error:SQLError) 
{ 
    trace("Error message:", error.message); 
    trace("Details:", error.details); 
} 
<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()"> 
    <mx:Script> 
        <![CDATA[ 
            import flash.data.SQLConnection; 
            import flash.data.SQLResult; 
            import flash.data.SQLStatement; 
            import flash.errors.SQLError; 
             
            private function init():void 
            { 
                // ... create and open the SQLConnection instance named conn ... 
                 
                // create the SQL statement 
                var selectStmt:SQLStatement = new SQLStatement(); 
                selectStmt.sqlConnection = conn; 
                 
                // define the SQL text 
                var sql:String =  
                    "SELECT firstName, lastName " +  
                    "FROM employees"; 
                selectStmt.text = sql; 
                 
                try 
                { 
                    // execute the statement 
                    selectStmt.execute(); 
                     
                    // access the result data 
                    var result:SQLResult = selectStmt.getResult(); 
                     
                    var numRows:int = result.data.length; 
                    for (var i:int = 0; i < numRows; i++) 
                    { 
                        var output:String = ""; 
                        for (var columnName:String in result.data[i]) 
                        { 
                            output += columnName + ": "; 
                            output += result.data[i][columnName] + "; "; 
                        } 
                        trace("row[" + i.toString() + "]\t", output); 
                    } 
                } 
                catch (error:SQLError) 
                { 
                    trace("Error message:", error.message); 
                    trace("Details:", error.details); 
                } 
            } 
        ]]> 
    </mx:Script> 
</mx:WindowedApplication>

Definiera datatypen för SELECT-resultatdata

Som standard skapas varje rad som returneras av en SELECT -sats som en objektinstans, där resultatmängdens kolumnnamn är objektets egenskapsnamn, och varje kolumns värde utgörs av värdet på den associerade egenskapen. Innan du kör en SELECT -sats (SQL) kan du dock ange SQLStatement-instansens itemClass -egenskap till en klass. http://help.adobe.com/sv_SE/Flash/CS5/AS3LR/flash/data/SQLStatement.html När du anger egenskapen itemClass skapas varje rad som returneras av SELECT -satsen som en instans av den angivna klassen. I körningen tilldelas resultatkolumnvärden till egenskapsvärden genom att kolumnnamnen i SELECT -resultatmängden matchas med egenskaperna i klassen itemClass .

Varje klass som har tilldelats som ett itemClass -egenskapsvärde måste ha en konstruktor som inte kräver några parametrar. Klassen får dessutom bara ha en enda egenskap för varje kolumn som returneras av SELECT -satsen. Det ses som ett fel om en kolumn i SELECT -listan inte har något motsvarande egenskapsnamn i klassen itemClass .

Hämta SELECT-resultat i delar

Som standard hämtas alla rader i resultatmängden samtidigt vid en SELECT -satskörning. När satsen har slutförts bearbetar du vanligtvis de data som har hämtats på något sätt. Du kanske skapar objekt eller visar data på skärmen. Om satsen returnerar ett stort antal rader kan det vara krävande för datorn att bearbeta alla data samtidigt, vilket i sin tur kan medföra att användargränssnittet inte uppdateras (ritas om).

Du kan förbättra prestanda för programmet genom att ange att ett visst antal resultatrader ska returneras åt gången i körningen. På så sätt returneras initiala resultatdata snabbare. Det gör även att du kan dela in resultatraderna i mängder, så att användargränssnittet uppdateras efter att varje mängd rader har bearbetats. Observera att det endast är praktiskt att använda den här tekniken i asynkront körningsläge.

Om du vill hämta SELECT -resultat i delar anger du ett värde för SQLStatement.execute() -metodens första parameter (parametern prefetch ). Parametern prefetch anger antalet rader som ska hämtas första gången satsen körs. När du anropar en SQLStatement -instans execute() -metod ska du ange ett prefetch -parametervärde så att endast det antalet rader hämtas:

var stmt:SQLStatement = new SQLStatement(); 
stmt.sqlConnection = conn; 
     
stmt.text = "SELECT ..."; 
     
stmt.addEventListener(SQLEvent.RESULT, selectResult); 
     
stmt.execute(20); // only the first 20 rows (or fewer) are returned 

Med satsen skickas en result -händelse som anger att den första mängden resultatrader är tillgänglig. Den resulterande SQLResult -instansens data -egenskap innehåller dataraderna och egenskapen complete anger om det finns ytterligare resultatrader att hämta. Om du vill hämta ytterligare resultatrader anropar du SQLStatement-instansens next() -metod. Precis som för metoden execute() används next() -metodens första parameter för att ange hur många rader som ska hämtas nästa gång result-händelsen skickas.

function selectResult(event:SQLEvent):void 
{ 
    var result:SQLResult = stmt.getResult(); 
    if (result.data != null) 
    { 
        // ... loop through the rows or perform other processing ... 
         
        if (!result.complete) 
        { 
            stmt.next(20); // retrieve the next 20 rows 
        } 
        else 
        { 
            stmt.removeEventListener(SQLEvent.RESULT, selectResult); 
        } 
    } 
} 

SQLStatement skickar en result -händelse varje gång next() -metoden returnerar en efterföljande mängd resultatrader. Du kan alltså fortsätta att bearbeta resultaten med samma lyssnarfunktion (från next() -anrop) tills alla rader har hämtats.

Mer information finns i beskrivningarna för SQLStatement.execute() -metoden (beskrivningen av parametern prefetch ) och SQLStatement.next() -metoden.