Insertion de donnéesAdobe AIR 1.0 et ultérieur 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 INSERTPour 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éesAprè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 :
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. |
|