Wstawianie danych

Adobe AIR 1.0 i starsze wersje

Dodawanie danych do bazy danych polega na wykonaniu instrukcji SQL INSERT . Po zakończeniu wykonywania instrukcji można uzyskać dostęp do klucza podstawowego nowo wstawionego wiersza, pod warunkiem że klucz został wygenerowany przez bazę danych.

Wykonywanie instrukcji INSERT

W celu dodania danych do tabeli bazy danych należy utworzyć i uruchomić instancję klasy SQLStatement , której tekstem będzie instrukcją SQL INSERT .

W poniższym przykładzie wykorzystano instancję klasy SQLStatement w celu dodania wiersza danych do istniejącej tabeli employees. Przykład prezentuje wstawianie danych w trybie wykonywania asynchronicznego. W tym przykładzie przyjęto, że istnieje instancja klasy SQLConnection o nazwie conn , która jest już połączona z bazą danych. Założono również, że tabela „pracownicy” została już utworzona.

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>

W poniższym przykładzie przedstawiono dodawanie wiersza danych do istniejącej tabeli employees przy użyciu trybu wykonywania synchronicznego. W tym przykładzie przyjęto, że istnieje instancja klasy SQLConnection o nazwie conn , która jest już połączona z bazą danych. Założono również, że tabela „pracownicy” została już utworzona.

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>

Pobieranie wygenerowanego przez bazę danych klucza podstawowego wstawionego wiersza

Często po wstawieniu wiersza danych do tabeli kod musi poznać klucz podstawowy wygenerowany przez bazę danych lub wartość identyfikatora wiersza dla nowo wstawionego wiersza. Na przykład: po wstawieniu wiersza do jednej tabeli możliwe jest dodanie wierszy do tabeli powiązanej. W takim przypadku konieczne może być wstawienie wartości klucza podstawowego jako klucza obcego do powiązanej tabeli. Klucz podstawowy nowo wstawionego wiersza można uzyskać za pomocą obiektu SQLResult wygenerowanego na skutek wykonania instrukcji. Jest to ten sam obiekt, który jest używany w celu uzyskania dostępu do danych wynikowych po wykonaniu instrukcji SELECT . Zakończenie wykonywania instrukcji INSERT — podobnie jak w przypadku każdej instrukcji SQL — powoduje utworzenie w środowisku wykonawczym instancji klasy SQLResult. Dostęp do instancji klasy SQLResult uzyskuje się poprzez wywołanie metody getResult() obiektu SQLStatement , pod warunkiem że używany jest detektor zdarzeń lub używany jest tryb wykonywania synchronicznego. Jeśli stosowany jest tryb wykonywania asynchronicznego, a instancja klasy Responder zostanie przekazana do wywołania execute() , wówczas instancja klasy SQLResult zostanie przekazana jako argument do funkcji obsługi wyników. W każdym z tych przypadków instancja klasy SQLResult ma właściwość lastInsertRowID , która zawiera identyfikator wiersza wstawionego jako ostatni, jeśli wykonana została instrukcja SQL INSERT .

Poniższy przykład prezentuje dostęp do klucza podstawowego wstawionego wiersza w trybie wykonywania asynchronicznego:

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 
} 

Poniższy przykład prezentuje dostęp do klucza podstawowego wstawionego wiersza w trybie wykonywania synchronicznego:

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 
} 

Identyfikator wiersza może być wartością kolumny wyznaczonej jako kolumna klucza podstawowego w definicji tabeli, zgodnie z poniższymi regułami:

  • Jeśli tabela jest zdefiniowana z kolumną klucza podstawowego, którego powinowactwo (typ danych kolumny) to INTEGER , wówczas właściwość lastInsertRowID zawiera wartość, która została wstawiona do wiersza (lub zawiera wartość wygenerowaną przez środowisko wykonawcze, jeśli jest to kolumna AUTOINCREMENT ).

  • Jeśli tabela jest zdefiniowana z wieloma kolumnami klucza podstawowego (klucz złożony) lub z jedną kolumną klucza podstawowego o powinowactwie innym niż INTEGER , wówczas w tle baza danych generuje wartość całkowitoliczbową identyfikatora dla wiersza. Ta wygenerowana wartość jest wartością właściwości lastInsertRowID .

  • Wartość jest zawsze identyfikatorem wiersza wstawionego jako ostatni. Jeśli instrukcja INSERT spowoduje uruchomienie wyzwalacza, który wstawi wiersz, wówczas właściwość lastInsertRowID będzie zawierała identyfikator ostatniego wiersza wstawionego przez wyzwalacz, a nie wiersza wstawionego przez instrukcję INSERT .

W konsekwencji — jeśli wymagane jest jawne zdefiniowanie kolumny klucza podstawowego, którego wartość będzie dostępna po wykonaniu polecenia INSERT za pośrednictwem właściwości SQLResult.lastInsertRowID , wówczas kolumna musi być zdefiniowana jako kolumna INTEGER PRIMARY KEY . Nawet jeśli tabela nie zawiera jawnej kolumny INTEGER PRIMARY KEY , równie dobrze w roli klucza podstawowego dla tabeli można zastosować identyfikator wiersza wygenerowany przez bazę danych i nie będzie to miało wpływu na definiowanie relacji z powiązanymi tabelami. Wartość kolumny identyfikatora wiersza może być dostępna w dowolnej instrukcji SQL — w tym celu należy użyć jednej z nazw kolumn specjalnych: ROWID , _ROWID_ lub OID . W powiązanej tabeli można utworzyć kolumnę klucza obcego i użyć wartości identyfikatora wiersza jako wartości kolumny klucza obcego, tak jak w każdej jawnie zadeklarowanej kolumnie INTEGER PRIMARY KEY . W takim przypadku, jeśli używany jest dowolny klucz podstawowy a nie klucz naturalny i jeśli dozwolone jest wygenerowanie wartości klucza podstawowego przez środowisko wykonawcze, wówczas to, czy kluczem podstawowym tabeli służącym do definiowania relacji klucza obcego między dwiema tabelami będzie kolumna INTEGER PRIMARY KEY czy identyfikator wiersza wygenerowany przez system stanowi niewielką różnicę.

Więcej informacji o kluczach głównych i generowanych identyfikatorach wierszy zawiera sekcja Obsługa języka SQL w lokalnych bazach danych .