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

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 в локальных базах данных ».