Inserção de dados

Adobe AIR 1.0 e posterior

A inclusão de dados em um banco de dados envolve executar uma instrução SQL INSERT . Depois de concluída a execução da instrução, você poderá acessar a chave primária da linha recém-inserida se a chave tiver sido gerada pelo banco de dados.

Execução de uma instrução INSERT

Para adicionar dados a uma tabela de um banco de dados, crie e execute uma instância de SQLStatement cujo texto é uma instrução SQL INSERT .

O exemplo a seguir usa uma ocorrência de SQLStatement para adicionar uma linha de dados à tabela employees já existente. Este exemplo demonstra como inserir dados usando o modo de execução assíncrona. Observe que esta listagem presume que existe uma instância de SQLConnection denominada conn que já foi instanciada e já está conectada a um banco de dados. Ela também presume que a tabela “employees” já foi criada.

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>

O exemplo a seguir adiciona uma linha de dados à tabela employees já existente usando o modo de execução síncrona. Observe que esta listagem presume que existe uma instância de SQLConnection denominada conn que já foi instanciada e já está conectada a um banco de dados. Ela também presume que a tabela “employees” já foi criada.

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>

Recuperação de uma chave primária gerada pelo banco de dados de uma linha inserida

Com frequência, depois de inserir uma linha de dados a uma tabela, o código precisa ser informado sobre uma chave primária gerada pelo banco de dados ou o valor do identificador da linha recém-inserida. Por exemplo, depois de inserir uma linha em uma tabela, você deve adicionar linhas a uma tabela relacionada. Nesse caso, convém inserir o valor da chave primária como chave externa na tabela relacionada. A chave primária de uma linha recém-inserida pode ser recuperada usando o objeto SQLResult associado à execução da instrução. É o mesmo objeto usado para acessar dados de resultado depois que uma instrução SELECT é executada. Assim como ocorre com qualquer instrução SQL, quando a execução de uma instrução INSERT é concluída, o tempo de execução cria uma ocorrência de SQLResult. Para acessar a instância de SQLResult, chame o método getResult() do objeto SQLStatement se você estiver usando um ouvinte de evento ou o modo de execução síncrona. Se preferir, caso esteja usando o modo de execução assíncrona e passe uma instância de Responder para a chamada de execute() , a instância de SQLResult será passada como argumento para a função do manipulador resultante. Seja como for, a ocorrência de SQLResult tem uma propriedade, chamada lastInsertRowID , que contém o identificador de linha da linha inserida mais recentemente se a instrução SQL executada é uma instrução INSERT .

Este exemplo mostra como acessar a chave primária de uma linha inserida no modo de execução assíncrona:

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 
} 

Este exemplo mostra como acessar a chave primária de uma linha inserida no modo de execução síncrona:

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 
} 

Observe que o identificador de linha pode ou não ser o valor da coluna designada como a coluna de chave primária na definição de tabela, de acordo com as seguintes regras:

  • Se a tabela está definida com uma coluna de chave primária cuja afinidade (tipo de dados da coluna) é INTEGER , a propriedade lastInsertRowID contém o valor inserido nessa linha (ou o valor gerado pelo tempo de execução, no caso de uma coluna AUTOINCREMENT ).

  • Se a tabela estiver definida com várias colunas de chave primária (uma chave composta) ou com uma única coluna de chave primária cuja afinidade não é INTEGER , o banco de dados gera um valor inteiro identificador de coluna para a linha em segundo plano. Esse valor gerado é o valor da propriedade lastInsertRowID .

  • O valor é sempre o identificador de linha da linha inserida mais recentemente. Se uma instrução INSERT faz com que seja acionado um disparador que, por sua vez, insere uma linha, a propriedade lastInsertRowID contém o identificador de linha da última linha inserida pelo disparador em vez da linha criada pela instrução INSERT .

Em virtude dessas regras, se você quiser ter uma coluna de chave primária definida explicitamente cujo valor fica disponível após um comando INSERT através da propriedade SQLResult.lastInsertRowID , a coluna deverá ser definida como uma coluna INTEGER PRIMARY KEY . Mesmo que a tabela não inclua uma coluna INTEGER PRIMARY KEY explícita, será igualmente aceitável usar o identificador de linha gerado pelo banco de dados como uma chave primária para a sua tabela com o intuito de definir relacionamentos com tabelas relacionadas. O valor da coluna do identificador de linha fica disponível em qualquer instrução SQL através do uso de um dos nomes de coluna especiais ROWID , _ROWID_ ou OID . É possível criar uma coluna de chave externa em uma tabela relacionada e usar o valor do identificador de linha como o valor da coluna de chave externa, assim como você faria com uma coluna INTEGER PRIMARY KEY declarada explicitamente. Nesse sentido, se estiver usando uma chave primária arbitrária em vez de uma chave natural, e desde que não se importe que o tempo de execução gere o valor da chave primária para você, faz pouca diferença se você usa uma coluna INTEGER PRIMARY KEY ou o identificador de linha gerado pelo sistema como a chave primária de uma tabela para definir um relacionamento de chave externa entre duas tabelas.

Para obter mais detalhes sobre chaves primárias e identificadores e linha gerados, consulte Suporte SQL em bancos de dados locais .