與非同步執行模式的程式碼相較之下,使用同步執行時,您用來執行及回應作業的實際程式碼會有些微差異。兩種做法之間的主要差異有兩方面:首先,執行的作業需取決於其它作業 (例如,
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();
}
|
|
|