Infoga dataAdobe AIR 1.0 och senare När du hämtar data till en databas kör du en INSERT-sats (SQL). När satskörningen har slutförts kan du få åtkomst till primärnyckeln för den nyligen infogade raden om nyckeln genererades av databasen. Köra en INSERT-satsOm du vill lägga till data i en tabell i en databas skapar och kör du en SQLStatement-instans vars text är en INSERT-sats (SQL). I följande exempel används en SQLStatement-instans för att lägga till en datarad i den befintliga tabellen ”employees”. I det här exemplet visas hur du infogar data i asynkront körningsläge. Observera att koden i det här exemplet innehåller en SQLConnection-instans med namnet conn som redan har initierats och är ansluten till en databas. I exemplet antas också att tabellen ”employees” redan har skapats. 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> I följande exempel läggs en datarad till i den befintliga tabellen ”employees” i synkront körningsläge. Observera att koden i det här exemplet innehåller en SQLConnection-instans med namnet conn som redan har initierats och är ansluten till en databas. I exemplet antas också att tabellen ”employees” redan har skapats. 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> Hämta en databasgenererad primärnyckel för en infogad radNär du har infogat en datarad i en tabell måste koden ofta innehålla en databasgenererad primärnyckel eller ett radidentifierarvärde för den nyligen infogade raden. När du till exempel har infogat en rad i en tabell kanske du vill lägga till rader i en relaterad tabell. I så fall måste du infoga primärnyckelvärdet som en främmande nyckel i den relaterade tabellen. Primärnyckeln för en nyligen infogad rad kan hämtas med hjälp av det SQLResult-objekt som är associerat med satskörningen. Det här är samma objekt som används för att få åtkomst till resultatdata efter att en SELECT-sats har körts. Liksom med SQL-satser skapas en SQLResult-instans när körningen av en INSERT-sats har slutförts. Du får åtkomst till SQLResult-instansen genom att anropa SQLStatement-objektetsgetResult()-metod om du använder en händelselyssnare eller använder synkront körningsläge. Alternativt kan du använda asynkront körningsläge och skicka en Responder-instans till execute()-anropet, så att SQLResult-instansen skickas som ett argument till resultathanterarfunktionen. Oavsett vilket alternativ du väljer har SQLResult-instansen egenskapen lastInsertRowID, som innehåller radidentifieraren för den senast infogade raden, om SQL-satsen som kördes är en INSERT-sats. I följande exempel visas hur du får åtkomst till primärnyckeln för en infogad rad i asynkront körningsläge: 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 } I följande exempel visas hur du får åtkomst till primärnyckeln för en infogad rad i synkront körningsläge: 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 } Observera att radidentifieraren kan vara (eller inte vara) värdet för kolumnen som har angetts som primärnyckelkolumn i tabelldefinitionen enligt följande regler:
Om du som en konsekvens av de här reglerna vill ha en explicit definierad primärnyckelkolumn vars värde är tillgängligt efter ett INSERT-kommando via egenskapen SQLResult.lastInsertRowID, måste kolumnen definieras som en INTEGER PRIMARY KEY-kolumn. Men även om tabellen inte innehåller någon explicit INTEGER PRIMARY KEY-kolumn går det lika bra att använda den databasgenererade radidentifieraren som primärnyckel för tabellen när du definierar relationer med relaterade tabeller. Värdet för radidentifierarkolumnen är tillgängligt i alla SQL-satser när du använder något av kolumnnamnen ROWID, _ROWID_ eller OID. Du kan skapa en kolumn för främmande nyckel i en relaterad tabell och använda radidentifierarvärdet som kolumnvärde för främmande nyckel på samma sätt som du skulle ha gjort med en explicit deklarerad INTEGER PRIMARY KEY-kolumn. Om du använder en godtycklig primärnyckel i stället för en naturlig nyckel, och så länge du inte har något emot att primärnyckelvärdet genereras åt dig i körningen, blir det inte så stor skillnad om du använder en INTEGER PRIMARY KEY-kolumn eller den systemgenererade radidentifieraren som tabellens primärnyckel när du definierar en relation för främmande nyckel mellan två tabeller. Mer information om primärnycklar och genererade radidentifierare finns i SQL-stöd i lokala databaser. |
|