Abrufen von Daten aus einer Datenbank

Adobe AIR 1.0 und höher

Das Abrufen von Daten aus einer Datenbank beinhaltet zwei Schritte. Zunächst führen Sie eine SQL- SELECT -Anweisung aus, mit der Sie die Gruppe von Daten beschreiben, die Sie aus Datenbank abrufen möchten. Als Nächstes greifen Sie auf die abgerufenen Daten zu und zeigen sie an oder bearbeiten sie, wie für Ihre Anwendung erforderlich.

Ausführen einer SELECT-Anweisung

Zum Abrufen vorhandener Daten aus einer Datenbank verwenden Sie eine SQLStatement -Instanz. Weisen Sie der text -Eigenschaft der Instanz die entsprechende SQL- SELECT -Anweisung zu und rufen Sie dann ihre execute() -Methode auf.

Einzelheiten zur Syntax der SELECT -Anweisung finden Sie unter SQL-Unterstützung in lokalen Datenbanken .

Im folgenden Beispiel wird eine SELECT -Anweisung ausgeführt, um Daten aus der Tabelle „products“ abzurufen, wobei der asynchrone Ausführungsmodus verwendet wird:

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>

Im folgenden Beispiel wird eine SELECT -Anweisung ausgeführt, um Daten aus der Tabelle „products“ abzurufen, wobei der synchrone Ausführungsmodus verwendet wird:

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>

Im asynchronen Modus löst die SQLStatement-Instanz nach dem Ausführen der Anweisung ein result -Ereignis aus ( SQLEvent.RESULT ) und zeigt damit an, dass die Anweisung erfolgreich ausgeführt wurde. Alternativ dazu, falls ein Responder -Objekt als Argument an die execute() -Methode übergeben wird, wird die Ergebnisprozedurfunktion des Responder-Objekts aufgerufen. Im synchronen Ausführungsmodus wird die Ausführung angehalten, bis die execute() -Operation abgeschlossen ist, erst danach wird die nächste Codezeile ausgeführt.

Zugriff auf die Ergebnisdaten der SELECT-Anweisung

Nachdem die Ausführung der SELECT -Anweisung beendet wurde, wird im nächsten Schritt auf die abgerufenen Daten zugegriffen. Sie rufen die Ergebnisdaten nach dem Ausführen einer SELECT -Anweisung ab, indem Sie die getResult() -Methode des SQLStatement-Objekts aufrufen:

var result:SQLResult = selectStatement.getResult();

Die getResult() -Methode gibt ein SQLResult -Objekt zurück. Die data -Eigenschaft des SQLResult-Objekts ist ein Array, das die Ergebnisse der SELECT -Anweisung enthält:

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]; 
}

Jede Datenzeile im SELECT -Ergebnissatz wird eine Object-Instanz im data -Array. Dieses Objekt verfügt über Eigenschaften, deren Namen mit den Spaltennamen des Ergebnissatzes übereinstimmen. Die Eigenschaften enthalten die Werte aus den Spalten des Ergebnissatzes. Angenommen, eine SELECT -Anweisung ergibt einen Ergebnissatz mit drei Spalten namens „itemId“ (Artikel-ID), „itemName“ (Artikelname) und „price“ (Preis). Für jede Zeile im Ergebnissatz wird eine Object-Instanz erstellt, die über die Eigenschaften itemId , itemName und price verfügt. Diese Eigenschaften enthalten die Werte aus den entsprechenden Spalten.

Im folgenden Codebeispiel wird eine SQLStatement-Instanz definiert, deren Text eine SELECT -Anweisung ist. Die Anweisung ruft Zeilen mit den Werten der Spalten firstName und lastName aus allen Zeilen einer Tabelle mit dem Namen employees ab. In diesem Beispiel wird der asynchrone Ausführungsmodus verwendet. Wenn die Ausführung abgeschlossen ist, wird die selectResult() -Methode aufgerufen und der Zugriff auf die resultierenden Datenzeilen erfolgt über SQLStatement.getResult() . Mit der trace() -Methode werden die Daten angezeigt. Beachten Sie, dass in diesem Beispiel davon ausgegangen wird, dass eine SQLConnection-Instanz mit dem Namen conn bereits instanziiert wurde und eine Verbindung mit der Datenbank besteht. Des Weiteren wird vorausgesetzt, dass die Tabelle „employees“ bereits erstellt und mit Daten gefüllt wurde.

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>

Im folgenden Beispiel wird dieselbe Vorgehensweise wie im vorstehenden Beispiel veranschaulicht, allerdings wird hier der synchrone Ausführungsmodus verwendet. Im Beispiel wird eine SQLStatement -Instanz definiert, deren Text eine SELECT -Anweisung ist. Die Anweisung ruft Zeilen mit den Werten der Spalten firstName und lastName aus allen Zeilen einer Tabelle mit dem Namen employees ab. Auf die resultierenden Datenzeilen wird mit SQLStatement.getResult() zugegriffen; die Anzeige erfolgt über die trace() -Methode. Beachten Sie, dass in diesem Beispiel davon ausgegangen wird, dass eine SQLConnection-Instanz mit dem Namen conn bereits instanziiert wurde und eine Verbindung mit der Datenbank besteht. Des Weiteren wird vorausgesetzt, dass die Tabelle „employees“ bereits erstellt und mit Daten gefüllt wurde.

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>

Definieren des Datentyps von SELECT-Ergebnisdaten

Standardmäßig wird jede Zeile, die von einer SELECT -Anweisung zurückgegeben wird, als eine Objektinstanz mit Eigenschaften, die nach den Spalten des Ergebnissatzes benannt sind, und mit dem Wert der einzelnen Spalten als Wert der jeweiligen Eigenschaft erstellt. Bevor Sie eine SQL- SELECT -Anweisung ausführen, können Sie jedoch die itemClass -Eigenschaft der SQLStatement -Instanz auf eine Klasse setzen. Indem Sie die itemClass -Eigenschaft festlegen, wird jede von der SELECT -Anweisung zurückgegebene Zeile als eine Instanz der jeweiligen Klasse erstellt. Die Laufzeitumgebung weist den Eigenschaften die Werte der Ergebnisspalten zu, indem die Spaltennamen im SELECT -Ergebnis auf die Namen der Eigenschaften in der itemClass -Klasse gesetzt werden.

Jede Klasse, die als ein itemClass -Eigenschaftenwert zugewiesen wird, muss über einen Konstruktor verfügen, der keine Parameter benötigt. Außerdem muss die Klasse je eine Eigenschaft für jede von der SELECT -Anweisung zurückgegebene Spalte aufweisen. Es gilt als Fehler, wenn es für eine Spalte der Liste SELECT keinen entsprechenden Eigenschaftsnamen in der Klasse itemClass gibt.

Abrufen von SELECT-Ergebnissen in Teilen

Standardmäßig ruft eine SELECT -Anweisung alle Zeilen des Ergebnissatzes gleichzeitig ab. Nachdem die Anweisung abgeschlossen ist, verarbeiten Sie die Daten normalerweise auf die eine oder andere Art; Sie erstellen zum Beispiel Objekte oder zeigen die Daten auf dem Bildschirm an. Wenn die Anweisung eine große Anzahl von Zeilen zurückgibt, kann die gleichzeitige Verarbeitung aller Daten sehr rechenintensiv sein, sodass die Benutzeroberfläche unter Umständen nicht aktualisiert wird.

Sie können die wahrgenommene Leistung Ihrer Anwendung verbessern, indem Sie die Laufzeitumgebung anweisen, jeweils nur eine bestimmte Anzahl von Ergebniszeilen zurückzugeben. Auf diese Weise werden die ersten Ergebnisdaten schneller zurückgegeben. Außerdem können Sie die Ergebniszeilen in Gruppen unterteilen, sodass die Benutzeroberfläche aktualisiert wird, nachdem die einzelnen Gruppen von Zeilen verarbeitet wurden. Beachten Sie, dass sich dieses Verfahren nur für den asynchronen Ausführungsmodus eignet.

Um SELECT -Ergebnisse in Teilen abzurufen, geben Sie einen Wert für den ersten Parameter (den prefetch -Parameter) der SQLStatement.execute() -Methode an. Der prefetch -Parameter gibt die Anzahl der Zeilen an, die beim ersten Ausführen der Anweisung abgerufen werden sollen. Wenn Sie für eine SQLStatement -Instanz die execute() -Methode aufrufen, geben Sie einen Wert für den prefetch -Parameter an, um nur diese Menge an Zeilen abzurufen:

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 

Die Anweisung löst das result -Ereignis aus und zeigt damit an, dass die erste Gruppe von Ergebniszeilen verfügbar ist. Die resultierende SQLResult -Instanz hat die data -Eigenschaft, die die Datenzeilen enthält. Die complete -Eigenschaft gibt an, ob noch weitere abzurufende Ergebniszeilen vorhanden sind. Um weitere Ergebniszeilen abzurufen, rufen Sie die next() -Methode der SQLStatement-Instanz auf. Wie die execute() -Methode wird der erste Parameter der next() -Methode verwendet, um anzuzeigen, wie viele Zeilen beim nächsten Auslösen des result-Ereignisses abgerufen werden sollen.

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

Die SQLStatement-Instanz löst ein result -Ereignis aus, wenn die next() -Methode eine folgende Gruppe von Ergebniszeilen zurückgibt. Deswegen kann dieselbe Listener-Funktion verwendet werden, um die Verarbeitung von Ergebnissen (aus next() -Aufrufen) fortzusetzen, bis alle Zeilen abgerufen wurden.

Weitere Informationen finden Sie in den Beschreibungen der SQLStatement.execute() -Methode (Beschreibung des prefetch -Parameters) und der SQLStatement.next() -Methode.