Inserimento dei dati

Adobe AIR 1.0 e versioni successive

L'aggiunta di dati in un database implica l'esecuzione dell'istruzione SQL INSERT. Una volta che l'istruzione ha finito di essere eseguita si può accedere alla chiave primaria della riga appena inserita, se la chiave è stata generata dal database.

Esecuzione dell'istruzione INSERT

Per aggiungere dati a una tabella in un database, create ed eseguite un'istanza SQLStatement il cui testo è l'istruzione SQL INSERT.

L'esempio seguente utilizza un'istanza SQLStatement per aggiungere una riga di dati alla tabella “employees” già esistente. Questo esempio illustra l'inserimento dei dati nella modalità di esecuzione asincrona. Tenete presente che questo elenco presuppone che esista un'istanza SQLConnection denominata conn già attivata e connessa al database. Presuppone inoltre che la tabella “employees” sia già stata creata.

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>

L'esempio seguente aggiunge una riga di dati alla tabella “employees” già esistente utilizzando la modalità di esecuzione sincrona. Tenete presente che questo elenco presuppone che esista un'istanza SQLConnection denominata conn già attivata e connessa al database. Presuppone inoltre che la tabella “employees” sia già stata creata.

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>

Recupero della chiave primaria generata dal database di una riga inserita

Spesso, dopo che si è inserita una riga di dati in una tabella, il codice richiede l'aggiunta di una chiave primaria generata dal database, o valore identificatore della riga, relativa alla riga appena inserita. Ad esempio, una volta che si sia inserita una riga in una tabella, si potrebbe voler aggiungere righe in una tabella correlata. In tal caso si dovrebbe inserire nella tabella correlata il valore della chiave primaria come chiave esterna. È possibile recuperare la chiave primaria di una riga appena inserita facendo uso dell'oggetto SQLResult generato dall'esecuzione dell'istruzione. Si tratta dello stesso oggetto utilizzato per accedere ai dati dei risultati dopo l'esecuzione dell'istruzione SELECT. Come per tutte le istruzioni SQL, quando l'esecuzione di INSERT viene completata il runtime crea un'istanza SQLResult. Potete accedere all'istanza SQLResult chiamando il metodo getResult() dell'oggetto SQLStatement, se state utilizzando un listener degli eventi o la modalità di esecuzione sincrona. In alternativa, se state utilizzando la modalità di esecuzione asincrona e passate un'istanza Responder alla chiamata execute(), l'istanza SQLResult viene passata alla funzione gestore evento risultato come argomento. In ogni caso, l'istanza SQLResult ha una proprietà, lastInsertRowID, che contiene l'identificatore della riga inserita più di recente se l'istruzione SQL eseguita è INSERT.

L'esempio seguente illustra l'accesso alla chiave primaria di una riga inserita nella modalità di esecuzione asincrona.

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 
} 

L'esempio seguente illustra l'accesso alla chiave primaria di una riga inserita nella modalità di esecuzione sincrona.

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 
} 

Tenete presente che l'identificatore della riga può anche non essere il valore della colonna designata come colonna della chiave primaria nella definizione della tabella, secondo le regole seguenti.

  • Se la tabella è definita con una colonna della chiave primaria la cui affinità (il tipo dei dati della colonna) è INTEGER, la proprietà lastInsertRowID contiene il valore che è stato inserito nella riga in oggetto (oppure il valore generato dal runtime se si tratta di una colonna AUTOINCREMENT).

  • Se la tabella è definita con più colonne della chiave primaria (chiave composta) oppure con una sola colonna della chiave primaria la cui affinità non è INTEGER, dietro le quinte il database genera un valore identificatore intero per la riga in oggetto. Tale valore generato è il valore della proprietà lastInsertRowID.

  • Il valore è sempre l'identificatore della riga inserita più di recente. Se l'istruzione INSERT produce un trigger che a sua volta inserisce una riga, la proprietà lastInsertRowID conterrà l'identificatore dell'ultima riga inserita dal trigger invece che di quella creata dall'istruzione INSERT.

Come conseguenza di queste regole, se desiderate avere una colonna della chiave primaria definita in modo esplicito il cui valore sia disponibile dopo il comando INSERT tramite la proprietà SQLResult.lastInsertRowID, tale colonna deve essere definita come colonna INTEGER PRIMARY KEY. Anche se la tabella non include una colonna INTEGER PRIMARY KEY esplicita, è ugualmente accettabile utilizzare l'identificatore della riga generato dal database come chiave primaria per la tabella, allo scopo di definire le relazioni con le tabelle correlate. Il valore della colonna dell'identificatore della riga è disponibile in tutte le istruzioni SQL se si usa uno dei nomi speciali delle colonne ROWID, _ROWID_ oppure OID. È possibile creare una colonna della chiave esterna in una tabella correlata ed utilizzare il valore identificatore della riga come valore della colonna della chiave esterna, esattamente come si fa nei casi in cui è presente una colonna INTEGER PRIMARY KEY dichiarata esplicitamente. Da questo punto di vista, se si sta usando un chiave primaria arbitraria invece che una chiave naturale, e se non si obietta al fatto che il runtime genera il valore della chiave primaria per conto dell'utente, non fa molta differenza che si utilizzi come chiave primaria di una tabella la colonna INTEGER PRIMARY KEY oppure l'identificatore della riga generato dal sistema, allo scopo di definire una relazione con chiave esterna fra due tabelle.

Per ulteriori informazioni sulle chiavi principali e gli identificatori di riga generati, vedete Supporto di SQL nei database locali.