Извлечение данных из базы данных

Adobe AIR 1.0 и более поздних версий

Извлечение данных из базы данных происходит в два этапа. Сначала необходимо выполнить инструкцию SQL SELECT , описывающую набор необходимых данных. Затем вы обращаетесь к извлеченным данным, отображаете их или выполняете над ними необходимые операции.

Выполнение инструкции SELECT

Для извлечения существующих данных из базы данных используется экземпляр SQLStatement . Присвойте соответствующую инструкцию SQL SELECT свойству text экземпляра, затем вызовите его метод execute() .

Сведения о синтаксисе инструкции SELECT см. в разделе « Поддержка SQL в локальных базах данных ».

Следующий пример иллюстрирует выполнение инструкции SELECT для извлечения данных из таблицы «products» с использованием режима асинхронного выполнения.

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>

Следующий пример иллюстрирует выполнение инструкции SELECT для извлечения данных из таблицы «products» в режиме синхронного выполнения.

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>

В режиме асинхронного выполнения по завершении выполнения инструкции экземпляр SQLStatement отправляет событие result ( SQLEvent.RESULT ), указывая на успешное выполнение инструкции. Как вариант, если объект Responder передается в качестве аргумента методу execute() , вызывается функция обработчика результатов объекта Responder. В синхронном режиме выполнение приостанавливается до завершения операции execute() , затем возобновляется со следующей строки кода.

Доступ к данным результатов выполнения инструкции SELECT

По завершении выполнения инструкции SELECT следующим шагом является получение доступа к извлеченным данным. Чтобы извлечь данные, полученные в результате выполнения инструкции SELECT , вызовите метод getResult() объекта SQLStatement.

var result:SQLResult = selectStatement.getResult();

Метод getResult() возвращает объект SQLResult . Свойство data объекта SQLResult представлено объектом Array, который содержит результаты выполнения инструкции 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]; 
}

Каждая строка данных в наборе результатов SELECT становится экземпляром Object в массиве data . Этот объект имеет свойства, имена которых совпадают с названиями столбцов в наборе результатов. Свойства содержат значения из столбцов набора результатов. Предположим, инструкция SELECT имеет набор результатов с тремя столбцами: «itemId», «itemName» и «price». Для каждой строки в наборе результатов создается экземпляр Object со свойствами itemId , itemName и price . Эти свойства содержат значения из соответствующих столбцов.

Следующий код определяет экземпляр SQLStatement, текстом которого является инструкция SELECT . Инструкция извлекает строки, содержащие значения столбцов firstName и lastName всех строк таблицы employees . В данном примере используется режим асинхронного выполнения. По завершении выполнения вызывается метод selectResult() , а доступ к полученным строкам данных осуществляется посредством метода SQLStatement.getResult() , и строки отображаются с использованием метода trace() . Заметьте, что данный код предполагает наличие инициализированного и подключенного к базе данных экземпляра SQLConnection с именем conn . Он также предполагает, что таблица «employees» уже создана и заполнена данными.

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>

Следующий код иллюстрирует тот же метод, что и в предыдущем примере, но использует режим синхронного выполнения. В примере определяется экземпляр SQLStatement , текстом которого является инструкция SELECT . Инструкция извлекает строки, содержащие значения столбцов firstName и lastName всех строк таблицы employees . Доступ к полученным строкам данных осуществляется посредством метода SQLStatement.getResult() , и строки отображаются при помощи метода trace() . Заметьте, что данный код предполагает наличие инициализированного и подключенного к базе данных экземпляра SQLConnection с именем conn . Он также предполагает, что таблица «employees» уже создана и заполнена данными.

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>

Определение типа данных результатов инструкции SELECT

По умолчанию каждая строка, возвращенная инструкцией SELECT , является экземпляром Object, свойства которого имеют те же имена, что и названия столбцов в наборе результатов, а значение каждого столбца является значением соответствующего свойства. Однако перед выполнением инструкции SQL SELECT можно присвоить класс свойству itemClass экземпляра SQLStatement . Задав свойство itemClass , каждая строка, возвращенная инструкцией SELECT , является экземпляром указанного класса. Среда выполнения присваивает значения столбцов результатов значениям свойств, устанавливая соответствие между названиями столбцов в наборе результатов SELECT и именами свойств в классе itemClass .

Каждый класс, являющийся значением свойства itemClass , должен иметь конструктор, не требующий параметров. Кроме того, этот класс должен иметь одно свойство для каждого столбца, возвращенного инструкцией SELECT . Если для столбца в списке SELECT не существует соответствующего имени свойства в классе itemClass , это считается ошибкой.

Извлечение результатов SELECT по частям

По умолчанию инструкция SELECT извлекает все строки набора результатов одновременно. По завершении выполнения инструкции извлеченные данные обрабатываются, например создаются объекты или данные отображаются на экране. Если инструкция возвратила большое количество строк, одновременная обработка всех данных является очень трудоемким процессом для компьютера, что может привести к тому, что пользовательский интерфейс перестанет обновляться.

Улучшить производительность приложения можно, предписав среде выполнения возвращать одновременно определенное количество строк результатов. Таким образом, данные результатов будут возвращаться быстрее. Это также позволяет разделить строки результатов на части, чтобы пользовательский интерфейс мог обновляться после обработки каждого набора строк. Обратите внимание на то, что использование такого метода эффективно только при работе в режиме асинхронного выполнения.

Для извлечения результатов SELECT по частям задайте значение первого параметра метода SQLStatement.execute() (параметра prefetch ). Параметр prefetch задает количество строк, которое нужно возвратить при первом выполнении инструкции. При вызове метода execute() экземпляра SQLStatement задайте значение параметра prefetch , чтобы возвратить определенное количество строк.

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 

Инструкция отправляет событие result , указывая на то, что доступен первый набор строк результатов. Полученное свойство data экземпляра SQLResult содержит строки данных, а его свойство complete указывает на то, есть ли еще строки для извлечения. Для извлечения дополнительных строк результатов вызовите метод next() экземпляра SQLStatement. Как и в случае с методом execute() , первый параметр метода next() используется для указания на то, сколько строк возвратить при следующей отправке события result.

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 отправляет событие result каждый раз, когда метод next() возвращает последующий набор строк результатов. Следовательно, ту же функцию прослушивателя можно использовать для продолжения обработки результатов (полученных вызовом метода next() ) до тех пор, пока не будут возвращены все строки.

Дополнительные сведения см. в описаниях для метода SQLStatement.execute() (описание параметра prefetch ) и метода SQLStatement.next() .