Adobe Air (wiwobooks.com Release)
// die nächsten 25 Datensätze abrufen
Auch dieser Aufruf wird den gleichen Ereignis-Listener verwenden wie der vorherige execute( )-Aufruf, sodass Sie darin lediglich die SQLStatement -Eigenschaft complete prüfen müssen, die als boolscher Wert angibt, ob alle Daten abgerufen sind ( true ) oder nicht ( false ). Der nachfolgende Quelltextausschnitt zeigt einen solchen Ereignis-Listener:
import flash.data.SQLConnection;
import flash.data.SQLStatement;
import flash.data.SQLResult;
import flash.events.SQLEvent;
import flash.events.SQLErrorEvent;
var selectStmt:SQLStatement = new SQLStatement();
// myDBConn ist bereits geöffnet (hier nicht gezeigt)
selectStmt.sqlConnection = myDBConn;
selectStmt.addEventListener(SQLErrorEvent.ERROR, handleDBError); selectStmt.addEventListener(SQLEvent.RESULT, handleSelectResult); selectStmt.text = "SELECT id, name, zahl FROM main.test_table"; selectStmt.execute(25);
function handleSelectResult(e:SQLEvent):void {
var stmt:SQLStatement = SQLStatement(e.target);
var result:SQLResult = stmt.getResult();
if(null !== result.data) {
if(!result.complete) {
// Quelltext zur Datenauswertung
stmt.next(25);
}
else {
// Quelltext zum Abschluss
// "Aufräumen" des Ereignis-Listeners
stmt.removeEventListener(SQLEvent.RESULT, handleSelectResult); }
}
}
Listing 13.7 Beispiel: teilweiser Abruf von Daten
Wenn Sie die Daten synchron abrufen, werden Sie den teilweisen Abruf der Ergebnisdaten in einer while -Schleife unterbringen wollen, die den Wert der complete -Eigenschaft prüft:
while(!result.complete) {
// Quelltext zu Datenauswertung
stmt.next(25);
}
// Quelltext zum Abschluss der Auswertung
Listing 13.8 Beispiel: teilweiser Abruf von Daten bei synchronem Zugriff
13.6.3 Dem Ergebnis eine eigene Klasse zuweisen
Wenn Sie ein Abfrageergebnis abrufen, wird dies als Array in der Eigenschaft data der SQLResult -Instanz abgelegt. Die einzelnen Elemente des Arrays sind standardmäßig einfache Objekte, die die Feldnamen der Datenbanktabellen als Eigenschaftsnamen haben und den Inhalt des Feldes als Eigenschaftswert. Je nach Komplexität Ihrer Anwendung und des zurückgegebenen Ergebnisses wollen Sie die Ergebnisse vielleicht in Instanzen einer eigenen Klasse weiterverarbeiten. Natürlich können Sie jedes einzelne Objekt im Array mit for each durchlaufen, die Eigenschaften auslesen und der entsprechenden Eigenschaft der Instanz der Zielklasse zuweisen. Da dies jedoch mühsam und umständlich wäre, bietet AIR auch die Möglichkeit, den Typ des einzelnen Ergebnisses einer bestimmten Klasse zuzuweisen. Allerdings müssen die abgerufenen Datenfelder als öffentliche Eigenschaften der Zielklasse definiert sein. Außerdem darf der Konstruktor der Klasse keine Parameter erwarten.
Lösungsweg
1. Definition einer Zielklasse mit den abzurufenden Datenfeldern als Eigenschaften
2. Öffnen einer Datenbankverbindung mithilfe einer SQLConnection -Instanz
3. Erstellen einer SQLStatement -Instanz
4. Zuweisen einer SELECT-Abfrage als Zeichenkette zur SQLStatement -Instanzeigenschaft text
5. Zuweisen des Klassennamens zur Eigenschaft itemClass der SQLStatement - Instanz
6. Aufruf der SQLStatement -Instanzmethode execute()
So geht es
Das nachfolgende Listing definiert eine sehr vereinfachte Klasse Mitarbeiter im Paket com.company.my :
package com.company.my {
public class Mitarbeiter {
public var id:uint; public var name:String; public var gehalt:Number;
public function Mitarbeiter() {} }
}
Listing 13.9 Beispiel: Mitarbeiter.as
Diese Klasse wird im anschließend aufgeführten Quelltextausschnitt verwendet, der eine Konsolenmeldung ausgibt, wenn die Typzuweisung gelungen ist:
import flash.data.SQLConnection;
import flash.data.SQLStatement;
import flash.data.SQLResult;
import flash.events.SQLEvent;
import flash.events.SQLErrorEvent;
import com.company.my.Mitarbeiter;
var selectStmt:SQLStatement = new SQLStatement();
// Datenbankverbindung ist geöffnet
selectStmt.sqlConnection = myDBConnection;
selectStmt.text = "SELECT id, name, gehalt FROM mitarbeiter"; selectStmt.itemClass = Mitarbeiter;
selectStmt.addEventListener(SQLEvent.RESULT, handleResult); selectStmt.addEventListener(SQLErrorEvent.ERROR, handleError);
function handleResult(e:SQLEvent):void {
var result:SQLResult = SQLStatement(e.target).getResult(); if(null !== result.data && result.data.length > 0) {
for(var i:uint = 0; i < result.data.length; i++) { if(result.data[i] is Mitarbeiter) {
trace("Typzuweisung erfolgreich!");
}
}
}
}
function
Weitere Kostenlose Bücher