使用同步資料庫作業

Adobe AIR 1.0 以及更新的版本

與非同步執行模式的程式碼相較之下,使用同步執行時,您用來執行及回應作業的實際程式碼會有些微差異。兩種做法之間的主要差異有兩方面:首先,執行的作業需取決於其它作業 (例如,SELECT 結果列或由 INSERT 陳述式所加入列的主索引鍵),其次,就是處理錯誤方面的差異。

為同步作業撰寫程式碼

同步與非同步執行之間的主要差異在於:同步執行模式中必須將程式碼撰寫成單一系列步驟。相反地,在非同步程式碼中,您需要登錄事件偵聽程式,而且經常需要將作業分配給所有偵聽程式方法。當資料庫以同步執行模式連線時,您可以在單一程式碼區塊中,依序執行一系列資料庫作業。下列範例將示範這種技巧:

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, OpenMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
// add the customer record to the database 
var insertCustomer:SQLStatement = new SQLStatement(); 
insertCustomer.sqlConnection = conn; 
insertCustomer.text = 
    "INSERT INTO customers (firstName, lastName) " +  
    "VALUES ('Bob', 'Jones')"; 
insertCustomer.execute(); 
     
var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
// add a related phone number record for the customer 
var insertPhoneNumber:SQLStatement = new SQLStatement(); 
insertPhoneNumber.sqlConnection = conn; 
insertPhoneNumber.text =  
    "INSERT INTO customerPhoneNumbers (customerId, number) " +  
    "VALUES (:customerId, '800-555-1234')"; 
insertPhoneNumber.parameters[":customerId"] = customerId; 
insertPhoneNumber.execute(); 
     
// commit the transaction 
conn.commit(); 

如您所見,不管是使用同步或非同步執行,您都會呼叫相同方法來執行資料庫作業。兩種做法之間的主要差異在於:執行的作業需取決於其它作業,及處理錯誤的方式。

執行的作業需取決於其它作業

當您使用同步執行模式時,不必撰寫偵聽事件的程式碼,以判斷作業何時完成;您可以認定,如果一行程式碼中的作業順利完成,就會繼續執行下一行程式碼。因此,若要執行取決於其它作業成功的作業,只要撰寫在所相依作業之後立即執行的相依程式碼即可。例如,若要編寫應用程式以開始交易,請執行 INSERT 陳述式,擷取已插入列的主索引鍵,將該索引鍵插入不同資料表中的其它列,最後認可交易,程式碼可以撰寫為一系列的陳述式。下列範例會示範這些作業:

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, SQLMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
// add the customer record to the database 
var insertCustomer:SQLStatement = new SQLStatement(); 
insertCustomer.sqlConnection = conn; 
insertCustomer.text = 
    "INSERT INTO customers (firstName, lastName) " +  
    "VALUES ('Bob', 'Jones')"; 
insertCustomer.execute(); 
     
var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
// add a related phone number record for the customer 
var insertPhoneNumber:SQLStatement = new SQLStatement(); 
insertPhoneNumber.sqlConnection = conn; 
insertPhoneNumber.text =  
    "INSERT INTO customerPhoneNumbers (customerId, number) " +  
    "VALUES (:customerId, '800-555-1234')"; 
insertPhoneNumber.parameters[":customerId"] = customerId; 
insertPhoneNumber.execute(); 
     
// commit the transaction 
conn.commit(); 

以同步執行處理錯誤

在同步執行模式中,您不會偵聽錯誤事件,以判斷作業是否已失敗,而會將任何可以觸發錯誤的程式碼包覆在一組 try..catch..finally 程式碼區塊中。您將擲出錯誤的程式碼包覆在 try 區塊中。撰寫要執行的動作,以便在不同 catch 區塊中,回應各類型的錯誤。請將無論成功或失敗都要執行的任何程式碼 (例如,關閉不再需要的資料庫連線) 放置在 finally 區塊中。下列範例將示範如何使用 try..catch..finally 區塊,以進行錯誤處理。它會以上一個範例為基礎,並加入錯誤處理程式碼:

var conn:SQLConnection = new SQLConnection(); 
     
// The database file is in the application storage directory 
var folder:File = File.applicationStorageDirectory; 
var dbFile:File = folder.resolvePath("DBSample.db"); 
     
// open the database 
conn.open(dbFile, SQLMode.UPDATE); 
     
// start a transaction 
conn.begin(); 
     
try 
{ 
    // add the customer record to the database 
    var insertCustomer:SQLStatement = new SQLStatement(); 
    insertCustomer.sqlConnection = conn; 
    insertCustomer.text = 
        "INSERT INTO customers (firstName, lastName)" +  
        "VALUES ('Bob', 'Jones')"; 
     
    insertCustomer.execute(); 
     
    var customerId:Number = insertCustomer.getResult().lastInsertRowID; 
     
    // add a related phone number record for the customer 
    var insertPhoneNumber:SQLStatement = new SQLStatement(); 
    insertPhoneNumber.sqlConnection = conn; 
    insertPhoneNumber.text =  
        "INSERT INTO customerPhoneNumbers (customerId, number)" +  
        "VALUES (:customerId, '800-555-1234')"; 
    insertPhoneNumber.parameters[":customerId"] = customerId; 
     
    insertPhoneNumber.execute(); 
     
    // if we've gotten to this point without errors, commit the transaction 
    conn.commit(); 
} 
catch (error:SQLError) 
{ 
    // rollback the transaction 
    conn.rollback(); 
}