Вставка данных

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 
} 

Заметьте, что идентификатор строки может представлять собой значение столбца, обозначенного как столбец первичного ключа в определении таблицы, а может и не представлять собой это значение. Это определяется в соответствии со следующими правилами:

  • Если в определении таблицы задан столбец первичного ключа, который относится к типу данных INTEGER, свойство lastInsertRowID содержит значение, которое было вставлено в эту строку (или значение, созданное средой выполнения, если это столбец AUTOINCREMENT).

  • Если в определении таблицы задано несколько столбцов первичного ключа (составной ключ) или один столбец первичного ключа с типом данных, отличным от типа INTEGER, база данных незаметно создает целочисленное значение идентификатора строки. Это созданное значение является значением свойства lastInsertRowID.

  • Это значение всегда является идентификатором последней вставленной строки. Если инструкция INSERT запускает триггер, который вставляет строку, свойство lastInsertRowID содержит идентификатор последней вставленной триггером строки, а не строки, созданной инструкцией INSERT.

Следовательно, если вы хотите иметь явно определенный столбец первичного ключа, значение которого должно быть доступно после выполнения команды INSERT через свойство SQLResult.lastInsertRowID, столбец должен быть определен как INTEGER PRIMARY KEY. Даже если таблица не содержит столбец INTEGER PRIMARY KEY, можно также использовать созданный базой данных идентификатор строки в качестве первичного ключа таблицы для определения взаимосвязи со связанными таблицами. Значение столбца идентификатора строки доступно в любой инструкции SQL через одно из специальных имен столбцов ROWID, _ROWID_ или OID. В связанной таблице можно создать столбец внешнего ключа и использовать значение идентификатора строки в качестве значения столбца внешнего ключа, как в случае с явно определенным столбцом INTEGER PRIMARY KEY. В этом случае при использовании произвольного первичного ключа вместо естественного ключа, и если вы не против создания средой выполнения значения первичного ключа, нет большой разницы в использовании столбца INTEGER PRIMARY KEY или идентификатора строки, созданного системой, в качестве первичного ключа таблицы для определения отношений внешнего ключа между двумя таблицами.

Дополнительные сведения о первичных ключах и генерируемых идентификаторах строк см. в разделе «Поддержка SQL в локальных базах данных».