Recuperação de dados de um banco de dados

Adobe AIR 1.0 e posterior

A recuperação de dados de um banco de dados envolve duas etapas. Primeiro, você executa uma instrução SQL SELECT que descreve o conjunto de dados desejado do banco de dados. Em seguida, você acessa os dados recuperados e os exibe ou manipula conforme exigido pelo aplicativo.

Execução de uma instrução SELECT

Para recuperar dados existentes de um banco de dados, use uma instância de SQLStatement . Atribua a instrução SQL SELECT adequada à propriedade text da ocorrência e, depois, chame o método execute() correspondente.

Para obter mais detalhes sobre a sintaxe da instrução SELECT , consulte Suporte SQL em bancos de dados locais .

O exemplo abaixo mostra como executar uma instrução SELECT para recuperar dados de uma tabela chamada “products” usando o modo de execução assíncrona:

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>

O exemplo a seguir demonstra a execução de uma instrução SELECT para recuperar dados de uma tabela chamada “produtos”, usando o modo de execução síncrona:

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>

No modo de execução assíncrona, quando a execução da instrução é concluída, a ocorrência de SQLStatement despacha um evento result ( SQLEvent.RESULT ) que indica que a instrução foi executada com sucesso. Como alternativa, se um objeto Responder for passado como argumento no método de execute() , a função do manipulador resultante do objeto Responder será chamada. No modo de execução síncrona, a execução pausa até que a operação execute() seja concluída e, em seguida, prossegue com a próxima linha de código.

Acesso a dados de resultados da instrução SELECT

Uma vez concluída a execução da instrução SELECT , a próxima etapa é acessar os dados que foram recuperados. Acesse os dados de resultados com a execução de uma instrução SELECT , chamando o método getResult() do objeto SQLStatement:

var result:SQLResult = selectStatement.getResult();

O método getResult() gera um objeto SQLResult . A propriedade data do objeto SQLResult é um Array que contém os resultados da instrução 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]; 
}

Cada linha de dados no conjunto de resultados de SELECT se transforma em uma instância do Objeto contida no Array data . Esse objeto tem propriedades cujos nomes correspondem aos nomes de coluna do conjunto de resultados. As propriedades contêm os valores das colunas do conjunto de resultados. Por exemplo, suponha que uma instrução SELECT especifique um conjunto de resultados com três colunas chamadas “itemId”, “itemName” e “price”. Para cada linha do conjunto de resultados, é criada uma ocorrência de Object com propriedades chamadas itemId , itemName e price . Essas propriedades contêm os valores das respectivas colunas.

A listagem de código a seguir define uma ocorrência de SQLStatement cujo texto é uma instrução SELECT . A instrução recupera linhas que contêm os valores de coluna firstName e lastName de todas as linhas de uma tabela denominada employees . Este exemplo utiliza o modo de execução assíncrona. Quando a execução é concluída, o método selectResult() é chamado, e as linhas de dados resultantes são acessadas usando SQLStatement.getResult() e exibidas usando o método trace() . Observe que esta listagem presume que existe uma ocorrência de SQLConnection denominada conn que já foi instanciada e já está conectada ao banco de dados. Ela também presume que a tabela “employees” já foi criada e preenchida com dados.

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>

A listagem de código a seguir demonstra as mesmas técnicas que a anterior, mas usa o modo de execução síncrona. O exemplo define uma instância de SQLStatement cujo texto é uma instrução SELECT . A instrução recupera linhas que contêm os valores de coluna firstName e lastName de todas as linhas de uma tabela denominada employees . As linhas de dados resultantes são acessadas usando SQLStatement.getResult() e exibidas usando o método trace() . Observe que esta listagem presume que existe uma ocorrência de SQLConnection denominada conn que já foi instanciada e já está conectada ao banco de dados. Ela também presume que a tabela “employees” já foi criada e preenchida com dados.

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>

Definição do tipo de dados dos dados resultantes de SELECT

Por padrão, cada linha retornada por uma instrução SELECT é criada como uma ocorrência de Object com propriedades nomeadas para os nomes de coluna do conjunto de resultados e com o valor de cada coluna como o valor da propriedade associada. Porém, antes de executar uma instrução SQL SELECT , você pode definir a propriedade itemClass da ocorrência de SQLStatement para uma classe. Quando é definida a propriedade itemClass , cada linha retornada pela instrução SELECT é criada como ocorrência da classe designada. O tempo de execução atribui valores de coluna resultantes a valores de propriedade comparando os nomes de coluna do conjunto de resultados de SELECT com os nomes das propriedades da classe itemClass .

Qualquer classe designada como um valor da propriedade itemClass deve ter um construtor que não exija parâmetros. Além disso, a classe deve ter uma única propriedade para cada coluna retornada pela instrução SELECT . Será considerado um erro se uma coluna da lista SELECT não tiver um nome de propriedade correspondente na classe itemClass .

Recuperação dos resultados de SELECT em partes

Por padrão, a execução de uma instrução SELECT recupera todas as linhas do conjunto de resultados de uma só vez. Uma vez concluída a instrução, geralmente você processa os dados recuperados de alguma forma; por exemplo, criando objetos ou exibindo os dados na tela. Se a instrução retornar muitas linhas, processar todos os dados de uma só vez pode exigir bastante do computador, o que, por sua vez, faz com que a interface do usuário não se redesenhe.

É possível melhorar o desempenho percebido do aplicativo instruindo o tempo de execução a retornar um determinado número de linhas de resultado por vez. Isso faz com que os dados resultantes iniciais sejam retornados mais rapidamente. Isso também permite dividir as linhas de resultados em conjuntos, para que a interface de usuário seja atualizada depois do processamento de cada conjunto de linhas. Só é prático usar esta técnica no modo de execução assíncrona.

Para recuperar os resultados de SELECT em partes, especifique um valor para o primeiro parâmetro do método SQLStatement.execute() (o parâmetro prefetch ). O parâmetro prefetch indica o número de linhas a serem recuperadas na primeira vez que a instrução é executada. Quando chamar o método execute() de uma instância de SQLStatement , especifique um valor de parâmetro prefetch e somente essas linhas serão recuperadas:

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 

A instrução despacha o evento result , indicando que o primeiro conjunto de linhas de resultado está disponível. A propriedade data da instância de SQLResult resultante contém as linhas de dados, e sua propriedade complete indica se existem mais linhas de resultado a serem recuperadas. Para recuperar linhas de resultados adicionais, chame o método next() da ocorrência de SQLStatement. Assim como o método execute() , o primeiro parâmetro do método next() é usado para indicar quantas linhas deverão ser recuperadas na próxima vez que o evento result for despachado.

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 despacha um evento result sempre que o método next() retorna um conjunto subsequente de linhas de resultado. Consequentemente, a mesma função de ouvinte pode ser usada para continuar processando os resultados (de chamadas de next() ) até que todas as linhas sejam recuperadas.

Para obter mais informações, consulte as descrições do método SQLStatement.execute() (a descrição do parâmetro prefetch ) e o método SQLStatement.next() .