上面一個章節介紹了如何使用InfoTransaction元件來實現資料的交易,这一節我們將介紹如何通過程式來進行資料的交易。
使用後端資料庫的Trigger方式來設計,因為Trigger可以讓你在Table Insert/Delete/Update時搭配Inserted與Deleted的新舊資料來自行下達SQL語句達到資料過帳的目的,這種寫法優點是很方便,只要負責下基本Insert/Delete/Update指令給資料庫就可已完成過帳,執行效能高。下面我們就通過例子來看看如何進行功能的實現。需要完成在sOrders這個Sever中,當訂單明細的產品數量(Quantity)修改時,將Products表中的UnitsOnOrder中纍加。
Step1>
首先找到sOrders這個專案,找到detail相應的OrderDetails的UpdateComponent
Step2>
在這個UpdateComponent的屬性頁找到Event按鈕
1. BeforeInsert
觸發在資料新增前,還未保存到資料庫的情況下。
2. BeforeModify
觸發在資料修改前,還未保存到資料庫的情況下。
3. BeforeDelete
觸發在資料刪除前,還未保存到資料庫的情況下。
4. AfterInsert
觸發在資料新增後,已保存到資料庫的情況下。
5. AfterModify
觸發在資料修改後,已保存到資料庫的情況下。
6. AfterDelete
觸發在資料刪除後,已保存到資料庫的情況下。
Step3>
這裡我們以BeforeModify為例子,在這個Event上雙擊進入程式碼編寫狀態。寫入如下程式
private void
ucOrderDetails_BeforeModify(object
sender, UpdateComponentBeforeModifyEventArgs e)
{
int
qtyOld = Convert.ToInt32(ucOrderDetails.GetFieldOldValue("Quantity"));
int
qtyNew = Convert.ToInt32(ucOrderDetails.GetFieldCurrentValue("Quantity"));
int
productId = Convert.ToInt32(ucOrderDetails.GetFieldCurrentValue("ProductID"));
if
(!qtyNew.Equals(qtyOld))
{
int diference = qtyNew - qtyOld;
string sql = "update Products set UnitsOnOrder = UnitOnOrder + " + diference.ToString() + " where ProductID = " + productId.ToString();
this.ExecuteCommand(sql, ucOrderDetails.conn,
ucOrderDetails.trans);
}
}
由上面的程式可以了解到當前修改資料的UpdateComponent擁有了GetFieldOldValue和GetFieldCurrentValue兩個方法,其中在BeforeInsert時,只有GetFieldCurrentValue可以有取出值。在BeforeDelete時,只有GetFieldOldValue方法可以取出值。
Step4>
做完上面的步驟,將sOrders重新建置,然後重新運行OrderWizard這個Page,在修改Detail存檔后,查看資料庫修改的語句。
Related Topics