Inserción de datos

Adobe AIR 1.0 y posterior

La adición de datos a una base de datos implica ejecutar una declaración SQL INSERT . Una vez que se termina de ejecutar la declaración, puede acceder a la clave principal para la fila recientemente insertada si la base de datos generó la clave.

Ejecución de una declaración INSERT

Para añadir datos a una tabla en una base de datos, se crea y ejecuta una instancia de SQLStatement cuyo texto es una declaración SQL INSERT .

En el siguiente ejemplo se utiliza una instancia SQLStatement para añadir una fila de datos a la tabla de empelados ya existente. En este ejemplo se demuestra la inserción de datos usando el modo de ejecución asíncrono. http://help.adobe.com/es_ES/Flash/CS5/AS3LR/flash/data/SQLConnection.html Observe que este código supone que existe una instancia SQLConnection denominada conn que ya se ha creado y está conectada a una base de datos. Asimismo supone que la tabla “employees” ya ha sido creada.

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>

En el siguiente ejemplo se añade una fila de datos a la tabla de empelados existente, usando el modo de ejecución sincrónico. http://help.adobe.com/es_ES/Flash/CS5/AS3LR/flash/data/SQLConnection.html Observe que este código supone que existe una instancia SQLConnection denominada conn que ya se ha creado y está conectada a una base de datos. Asimismo supone que la tabla “employees” ya ha sido creada.

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>

Recuperación de la clave principal generada por la base de datos de una fila insertada

A menudo, después de insertar una fila de datos en una tabla, el código necesita conocer una clave principal generada por la base de datos o un valor del identificador de fila para la fila recientemente insertada. Por ejemplo, una vez que inserta una fila en una tabla, puede añadir filas en una tabla relacionada. En ese caso querrá insertar el valor de la clave principal como una clave externa en la tabla relacionada. La clave principal de la fila recientemente insertada se puede recuperar usando el objeto SQLResult asociado a la ejecución de la declaración. Este es el mismo objeto que se utiliza para acceder a los datos del resultado después de ejecutar una declaración SELECT . Como con cualquier declaración SQL, cuando se completa la ejecución de una declaración INSERT el motor de ejecución crea una instancia SQLResult. Se accede a la instancia de SQLResult llamando al método getResult() del objeto SQLStatement si se usa un detector de evento o si usa el modo de ejecución sincrónico. Como alternativa, si usa el modo de ejecución asíncrono y pasa una instancia de Responder a la llamada execute() , la instancia SQLResult se pasa como un argumento a la función de control de resultados. En cualquier caso, la instancia SQLResult tiene una a propiedad, lastInsertRowID , que contiene el identificador de fila de la fila más recientemente insertada si la declaración SQL ejecutada es una declaración INSERT .

En el siguiente ejemplo se demuestra el acceso a la clave principal de una fila insertada en el modo de ejecución asíncrono:

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 
} 

En el siguiente ejemplo se demuestra el acceso a la clave principal de una fila insertada en el modo de ejecución sincrónico:

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 
} 

Observe que el identificador de fila puede o no ser el valor de la columna que está designada como la columna de la clave principal en la definición de la tabla, según las siguientes reglas:

  • Si se define la tabla con una columna de clave principal cuya afinidad (tipo de datos de columna) es INTEGER , la propiedad lastInsertRowID contiene el valor que se insertó en esa fila (o el valor generado por el motor de ejecución si es una columna AUTOINCREMENT ).

  • Si se define la tabla con múltiples columnas de clave principal (una clave compuesta) o con una sola columna de clave principal cuya afinidad no es INTEGER , en segundo plano la base de datos genera un valor del identificador de fila. Dicho valor generado es el valor de la propiedad lastInsertRowID .

  • El valor siempre es el identificador de fila de la fila más recientemente insertada. Si una declaración INSERT activa un desencadenador y a su vez inserta una fila, la propiedad lastInsertRowID contiene el identificador de fila de la última fila insertada por el desencadenador en lugar de la fila creada por la declaración INSERT .

Como consecuencia, si desea tener una columna de clave principal explícitamente definida cuya variable está disponible después de un comando INSERT a través de la propiedad SQLResult.lastInsertRowID , la columna debe estar definida como una columna INTEGER PRIMARY KEY . Aunque la tabla no incluye una columna explícita INTEGER PRIMARY KEY , resulta igualmente aceptable utilizar el identificador de fila generado por la base de datos como una clave principal para la tabla en el sentido de definir relaciones con tablas relacionadas. El valor de la columna del identificador de fila está disponible en cualquier declaración SQL utilizando uno de los nombres especiales de columna ROWID , _ROWID_ o OID . Puede crear una columna de clave externa en una tabla relacionada y usar el valor del identificador de fila como el valor de la columna de la clave externa como lo haría con una columna INTEGER PRIMARY KEY explícitamente declarada. En ese sentido, si está usando una clave principal arbitraria en lugar de una clave natural y siempre y cuando no le importe que el motor de ejecución genere el valor de la clave principal, no hay diferencia si utiliza una columna INTEGER PRIMARY KEY o el identificador de fila generado por el sistema como la clave principal de la tabla para definir una relación de clave externa entre dos tablas.

Para obtener más información sobre las claves principales y los identificadores de fila generados, consulte Compatibilidad de SQL en bases de datos locales .