Вставка данныхAdobe AIR 1.0 и более новых версий Добавление данных в базу данных предполагает выполнение инструкции SQL INSERT. По завершении выполнения инструкции можно получить доступ к первичному ключу вновь вставленной сроки, если такой ключ был создан базой данных. Выполнение инструкции INSERTДля добавления данных в таблицу базы данных необходимо создать и выполнить экземпляр SQLStatement, текстом которого является инструкция SQL INSERT. В следующем примере экземпляр SQLStatement используется для добавления строки данных в уже существующую таблицу «employees». Этот пример иллюстрирует вставку данных с использованием режима асинхронного выполнения. Заметьте, что данный код предполагает наличие инициализированного и подключенного к базе данных экземпляра 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 insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
// register listeners for the result and failure (status) events
insertStmt.addEventListener(SQLEvent.RESULT, insertResult);
insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError);
// execute the statement
insertStmt.execute();
function insertResult(event:SQLEvent):void
{
trace("INSERT statement succeeded");
}
function insertError(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 insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
// register listeners for the result and failure (status) events
insertStmt.addEventListener(SQLEvent.RESULT, insertResult);
insertStmt.addEventListener(SQLErrorEvent.ERROR, insertError);
// execute the statement
insertStmt.execute();
}
private function insertResult(event:SQLEvent):void
{
trace("INSERT statement succeeded");
}
private function insertError(event:SQLErrorEvent):void
{
trace("Error message:", event.error.message);
trace("Details:", event.error.details);
}
]]>
</mx:Script>
</mx:WindowedApplication>
Следующий код вставляет строку данных в уже существующую таблицу «employees» с использованием режима синхронного выполнения. Заметьте, что данный код предполагает наличие инициализированного и подключенного к базе данных экземпляра 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 insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
try
{
// execute the statement
insertStmt.execute();
trace("INSERT statement succeeded");
}
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 insertStmt:SQLStatement = new SQLStatement();
insertStmt.sqlConnection = conn;
// define the SQL text
var sql:String =
"INSERT INTO employees (firstName, lastName, salary) " +
"VALUES ('Bob', 'Smith', 8000)";
insertStmt.text = sql;
try
{
// execute the statement
insertStmt.execute();
trace("INSERT statement succeeded");
}
catch (error:SQLError)
{
trace("Error message:", error.message);
trace("Details:", error.details);
}
}
]]>
</mx:Script>
</mx:WindowedApplication>
Извлечение созданного базой данных первичного ключа вставленной строкиЧасто после вставки строки данных в таблицу код требует первичный ключ, созданный базой данных, или значение идентификатора строки для вновь вставленной строки. Например, при вставке строки в одну таблицу может потребоваться вставить строки в связанную таблицу. В таком случае потребуется вставить значение первичного ключа в качестве внешнего ключа в связанную таблицу. Первичный ключ вставленной строки можно извлечь при помощи объекта SQLResult, созданного при выполнении инструкции. Это тот же объект, что используется для доступа к данным результатов после выполнения инструкции SELECT. Как и в случае с любой другой инструкцией SQL, по завершении выполнения инструкции INSERT среда выполнения создает экземпляр SQLResult. Доступ к экземпляру SQLResult осуществляется путем вызова метода getResult() объекта SQLStatement, если используется прослушиватель событий или режим синхронного выполнения. Наоборот, если используется режим асинхронного выполнения и экземпляр Responder передается вызову метода execute(), экземпляр SQLResult передается в качестве аргумента функции обработчика результатов. В любом случае экземпляр SQLResult имеет свойство, lastInsertRowID, которое содержит идентификатор последней вставленной строки, если выполненная инструкция SQL является инструкцией INSERT. Следующий пример иллюстрирует доступ к первичному ключу вставленной строки в режиме асинхронного выполнения: insertStmt.text = "INSERT INTO ...";
insertStmt.addEventListener(SQLEvent.RESULT, resultHandler);
insertStmt.execute();
function resultHandler(event:SQLEvent):void
{
// get the primary key
var result:SQLResult = insertStmt.getResult();
var primaryKey:Number = result.lastInsertRowID;
// do something with the primary key
}
Следующий пример иллюстрирует доступ к первичному ключу вставленной строки в режиме синхронного выполнения: insertStmt.text = "INSERT INTO ...";
try
{
insertStmt.execute();
// get the primary key
var result:SQLResult = insertStmt.getResult();
var primaryKey:Number = result.lastInsertRowID;
// do something with the primary key
}
catch (error:SQLError)
{
// respond to the error
}
Заметьте, что идентификатор строки может представлять собой значение столбца, обозначенного как столбец первичного ключа в определении таблицы, а может и не представлять собой это значение. Это определяется в соответствии со следующими правилами:
Следовательно, если вы хотите иметь явно определенный столбец первичного ключа, значение которого должно быть доступно после выполнения команды INSERT через свойство SQLResult.lastInsertRowID, столбец должен быть определен как INTEGER PRIMARY KEY. Даже если таблица не содержит столбец INTEGER PRIMARY KEY, можно также использовать созданный базой данных идентификатор строки в качестве первичного ключа таблицы для определения взаимосвязи со связанными таблицами. Значение столбца идентификатора строки доступно в любой инструкции SQL через одно из специальных имен столбцов ROWID, _ROWID_ или OID. В связанной таблице можно создать столбец внешнего ключа и использовать значение идентификатора строки в качестве значения столбца внешнего ключа, как в случае с явно определенным столбцом INTEGER PRIMARY KEY. В этом случае при использовании произвольного первичного ключа вместо естественного ключа, и если вы не против создания средой выполнения значения первичного ключа, нет большой разницы в использовании столбца INTEGER PRIMARY KEY или идентификатора строки, созданного системой, в качестве первичного ключа таблицы для определения отношений внешнего ключа между двумя таблицами. Дополнительные сведения о первичных ключах и генерируемых идентификаторах строк см. в разделе «Поддержка SQL в локальных базах данных». |
|