Извлечение данных из базы данных происходит в два этапа. Сначала необходимо выполнить инструкцию 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()
.
|
|
|