插入数据

Adobe AIR 1.0 和更高版本

向数据库添加数据包括执行 SQL INSERT 语句。语句完成执行后,如果数据库生成了键,则可以访问新插入的行的主键。

执行 INSERT 语句

要向数据库中的表添加数据,请创建并执行其文本为 SQL INSERT 语句的 SQLStatement 实例。

以下示例使用 SQLStatement 实例向已存在的 employees 表添加数据行。此示例演示如何使用异步执行模式插入数据。请注意,此列表假定存在一个名为 connSQLConnection 实例,并且该实例已经实例化并连接到数据库。它还假定已创建“employees”表。

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>

以下示例使用同步执行模式向已存在的 employees 表添加数据行。请注意,此列表假定存在一个名为 connSQLConnection 实例,并且该实例已经实例化并连接到数据库。它还假定已创建“employees”表。

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>

检索已插入行的数据库生成的主键

通常,向表中插入数据行后,代码需要知道新插入行的数据库生成的主键或行标识符值。例如,在一个表中插入行后,您可能希望在相关表中添加行。在这种情况下,希望将主键值作为外键插入到相关表中。新插入的行的主键可使用与语句执行相关联的 SQLResult 对象进行检索。这是在执行 SELECT 语句后用来访问结果数据的同一对象。与任何 SQL 语句一样,INSERT 语句执行完成时,运行时将创建 SQLResult 实例。如果您使用的是事件侦听器或同步执行模式,则可通过调用 SQLStatement 对象的 getResult() 方法来访问 SQLResult 实例。或者,如果您使用的是异步执行模式并将 Responder 实例传递给 execute() 调用,则 SQLResult 实例将作为参数传递给结果处理函数。在任一情况下,SQLResult 实例都具有属性 lastInsertRowID;如果执行的 SQL 语句是 INSERT 语句,则该属性包含最近插入的行的行标识符。

以下示例演示如何在异步执行模式下访问已插入行的主键:

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 
} 

以下示例演示如何在同步执行模式下访问已插入行的主键:

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 
} 

请注意,根据以下规则,行标识符可能是也可能不是在表定义中指定为主键列的列值:

  • 如果表是用其关联(列数据类型)为 INTEGER 的主键列定义的,则 lastInsertRowID 属性包含插入到该行中的值(如果它是 AUTOINCREMENT 列,则为由运行时生成的值)。

  • 如果表是用多个主键列(组合键)或其关联不是 INTEGER 的单个主键列定义的,则数据库将在后台为行生成整数行标识符值。该生成的值是 lastInsertRowID 属性的值。

  • 该值始终是最近插入的行的行标识符。如果 INSERT 语句导致一个触发器激发(这将插入一行),则 lastInsertRowID 属性包含由触发器插入的最后一行的行标识符,而不是由 INSERT 语句创建的行的行标识符。

由于存在这些规则,因此,如果您希望获得显式定义的主键列,并且其值通过 SQLResult.lastInsertRowID 属性调用 INSERT 命令后获得,则该列必须定义为 INTEGER PRIMARY KEY 列。即使表不包括显式 INTEGER PRIMARY KEY 列,但就定义与相关表的关系而言,将数据库生成的行标识符用作表的主键也是同样可接受的。通过使用特殊的列名 ROWID_ROWID_OID 之一,行标识符列值在任何 SQL 语句中都是可用的。可以在相关表中创建外键列,并将行标识符值用作外键列值,就像显式声明的 INTEGER PRIMARY KEY 列一样。在该意义上,如果使用的是任意主键而不是自然键,并且只要您不在乎生成主键值的运行时,则将 INTEGER PRIMARY KEY 列还是系统生成的行标识符用作表的主键以定义两个表之间的外键关系几乎没有差别。

有关主键和生成的行标识符的详细信息,请参阅本地数据库中的 SQL 支持