Insertion de données

Adobe AIR 1.0 et les versions ultérieures

L’ajout de données dans une base de données implique l’exécution d’une instruction SQL INSERT . Lorsque l’exécution de l’instruction est terminée, vous pouvez accéder à la clé primaire de la ligne nouvellement insérée si la base de données en a généré une.

Exécution d’une instruction INSERT

Pour ajouter des données dans une table de base de données, créez et exécutez une occurrence de SQLStatement dont le texte est une instruction SQL INSERT .

L’exemple suivant utilise une occurrence de SQLStatement pour ajouter une ligne de données dans la table des employés déjà existante. Cet exemple décrit l’insertion de données en mode d’exécution asynchrone. Notez que ce code présuppose l’existence d’une occurrence de SQLConnection nommée conn , déjà instanciée et connectée à une base de données. Il suppose également que la table « employees » a déjà été créée.

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’exemple suivant ajoute une ligne de données à la table des employés existante, en mode d’exécution synchrone. Notez que ce code présuppose l’existence d’une occurrence de SQLConnection nommée conn , déjà instanciée et connectée à une base de données. Il suppose également que la table « employees » a déjà été créée.

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>

Récupération de la clé primaire d’une ligne insérée, générée par la base de données

Après l’insertion d’une ligne de données dans une table, il arrive souvent que le code doive connaître la clé primaire générée par la base de données ou une valeur d’identificateur de ligne pour la ligne nouvellement insérée. Par exemple, après avoir inséré une ligne dans une table, vous pouvez en ajouter d’autres dans une table associée. Dans ce cas, vous pouvez insérer la valeur de la clé primaire en tant que clé étrangère de la table associée. La clé primaire d’une ligne nouvellement insérée peut être récupérée par le biais de l’objet SQLResult généré par l’instruction exécutée. Il s’agit du même objet qui est utilisé pour accéder aux données du résultat après l’exécution d’une instruction SELECT . Comme pour toute instruction SQL, lorsque l’exécution d’une instruction INSERT se termine, le moteur d’exécution crée une occurrence de SQLResult. Pour accéder à l’occurrence de SQLResult, vous appelez la méthode getResult() de l’objet SQLStatement si vous utilisez un écouteur d’événements ou le mode d’exécution synchrone. Si vous utilisez le mode d’exécution asynchrone et que vous transmettez une occurrence de Responder à l’appel de la méthode execute() , l’occurrence de SQLResult est transmise en tant qu’argument à la fonction du gestionnaire de résultat. Dans tous les cas, l’occurrence de SQLResult a une propriété, lastInsertRowID , qui contient l’identificateur de la dernière ligne insérée si l’instruction SQL exécutée est une instruction INSERT .

L’exemple suivant montre comment accéder à la clé primaire d’une ligne insérée en mode d’exécution asynchrone :

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’exemple suivant montre comment accéder à la clé primaire d’une ligne insérée en mode d’exécution synchrone :

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 
} 

Notez que l’identificateur de ligne peut ou non correspondre à la valeur de la colonne désignée en tant que colonne de clé primaire dans la définition de la table, en fonction des règles suivantes :

  • Si la table est définie avec une colonne de clé primaire dont l’affinité (son type de données) est INTEGER , la propriété lastInsertRowID contient la valeur insérée dans cette ligne (ou celle générée par le moteur d’exécution s’il s’agit d’une colonne AUTOINCREMENT ).

  • Si la table comporte plusieurs colonnes de clés primaires (clé composite) ou une seule colonne de clés primaires dont l’affinité n’est pas INTEGER , la base de données génère une valeur d’identificateur de ligne entier en arrière-plan. La valeur générée est celle de la propriété lastInsertRowID .

  • La valeur est toujours l’identificateur de la dernière ligne insérée. Si une instruction INSERT provoque un déclencheur qui à son tour insère une ligne, la propriété lastInsertRowID contient l’identificateur de la dernière ligne insérée par le déclencheur et non la ligne créée par l’instruction INSERT .

La conséquence de ces règles est la suivante : pour obtenir une colonne de clés primaires définie de façon explicite dont la valeur est générée par une commande INSERT via la propriété SQLResult.lastInsertRowID , définissez la colonne en tant que colonne INTEGER PRIMARY KEY . Même si la table ne comprend pas de colonne INTEGER PRIMARY KEY explicite, il est également possible d’utiliser l’identificateur de ligne généré par la base de données comme clé primaire de la table (définition des relations avec les tables associées). La valeur de colonne de l’identificateur de ligne est disponible dans toute instruction SQL via l’utilisation des noms de colonne spéciaux ROWID , _ROWID_ ou OID . Vous pouvez créer une colonne de clé étrangère dans une table associée et utiliser la valeur de l’identificateur de ligne en tant que valeur de colonne de clé étrangère comme vous le feriez dans le cas d’une colonne INTEGER PRIMARY KEY explicitement déclarée. Ainsi, si vous utilisez une clé primaire arbitraire plutôt qu’une clé naturelle, et tant que la génération par le moteur d’exécution d’une valeur de clé primaire à votre place ne vous dérange pas, l’utilisation d’une colonne INTEGER PRIMARY KEY ou d’un identificateur de ligne généré par le système comme clé primaire de la table ne présente que peu de différence quant à la définition d’une relation de clé étrangère entre les deux tables.

Pour plus d’informations sur les clés principales et les identificateurs de ligne générés, voir Prise en charge de SQL dans les bases de données locales .