插入資料

Adobe AIR 1.0 以及更新的版本

將資料新增至資料庫,涉及執行 SQL INSERT 陳述式。陳述式執行完成之後,如果索引鍵是由資料庫產生的,您就可以存取新插入列的主索引鍵。

執行 INSERT 陳述式

若要將資料加入資料庫中的資料表,請建立並執行文字是 SQL INSERT 陳述式的 SQLStatement 實體。

下列範例會使用 SQLStatement 實體,將資料列加入現有的「employees」資料表。此範例會示範如何使用非同步執行模式插入資料。請注意,此程式碼假設有一個已實體化而且連線至資料庫的 SQLConnection 實體 conn。它也假設「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」資料表。請注意,此程式碼假設有一個已實體化而且連線至資料庫的 SQLConnection 實體 conn。它也假設「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 實體會傳遞並做為結果處理常式函數的引數。不論是哪種情況,如果已執行的 SQL 陳述式是 INSERT 陳述式,則 SQLResult 實體都會具有屬性 lastInsertRowID,其中包含最近插入之列的列識別名稱。

下列範例會示範在非同步執行模式中存取已插入列的主索引鍵:

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 陳述式所建立之列的列識別名稱。

這些規則的結果就是,如果您要有明確定義的主索引鍵欄,而其值可在執行 INSERT 命令之後透過 SQLResult.lastInsertRowID 屬性取得,則欄必須定義為 INTEGER PRIMARY KEY 欄。即使您的資料表並未包含明確的 INTEGER PRIMARY KEY 欄,在定義與相關資料表的關聯性時,一樣可以接受使用資料庫所產生的列識別名稱做為資料表的主索引鍵。列識別名稱欄值可以透過使用 ROWID_ROWID_OID 其中一個特殊欄名稱,於任何 SQL 陳述式中取得。您可以在相關資料表中建立外部索引鍵欄,並使用列識別名稱值做為外部索引鍵欄值,跟使用明確宣告的 INTEGER PRIMARY KEY 欄完全一樣。在此情形下,如果您使用任意主索引鍵而不是自然索引鍵,而且您不在乎執行階段會為您產生主索引鍵值,那麼,不管您使用 INTEGER PRIMARY KEY 欄或系統產生的列識別名稱做為資料表的主索引鍵,以定義兩個資料表之間的外部索引鍵關聯性,都不會有太大的差別。

如需主要索引鍵和產生之列識別名稱的詳細資訊,請參閱本機資料庫內的 SQL 支援