使用同步資料庫作業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(); } |
|