逐步解說:在交易中儲存資料
這個逐步解說將示範如何使用 System.Transactions 命名空間 (Namespace),在交易中儲存資料。這個範例會使用 Northwind 範例資料庫的 Customers 和 Orders 資料表。
必要條件
這個逐步解說會需要存取 Northwind 範例資料庫。如需設定 Northwind 範例資料庫的詳細資訊,請參閱 HOW TO:安裝範例資料庫。
建立 Windows 應用程式
第一個步驟是建立 [Windows 應用程式]。
若要建立新的 Windows 專案
在 Visual Studio 中,從 [檔案] 功能表建立新的 [專案]。
將專案命名為 SavingDataInATransactionWalkthrough。
選取 [Windows 應用程式],並按一下 [確定]。如需詳細資訊,請參閱開發用戶端應用程式。
[SavingDataInATransactionWalkthrough] 專案隨即建立並加入至 [方案總管]。
建立資料庫的資料來源
這個步驟會使用資料來源組態精靈,根據 Northwind 範例資料庫的 Customers 和 Orders 資料表來建立資料來源。
若要建立資料來源
按一下 [資料] 功能表上的 [顯示資料來源]。
在 [資料來源] 視窗中,選取 [加入新資料來源],以啟動 [資料來源組態精靈]。
請選取 [選擇資料來源類型] 頁面上的 [資料庫],再按 [下一步]。
在 [選擇資料連接] 頁面上,執行下列其中一項動作:
如果下拉式清單中有提供 Northwind 範例資料庫的資料連接,請選取這個資料連接。
-或-
選取 [新增連接] 以啟動 [新增/修改連接] 對話方塊,然後建立 Northwind 資料庫的連接。如需詳細資訊,請參閱新增/修改連接對話方塊 (一般)。
如果資料庫需要密碼,請選取選項來加入敏感性資料,然後按一下 [下一步]。
按一下 [將連接字串儲存到應用程式組態檔] 頁面上的 [下一步]。
在 [選擇您的資料庫物件] 頁面上,展開 [資料表] 節點。
選取 Customers 和 Orders 資料表,再按一下 [完成]。
[NorthwindDataSet] 便會加入專案中,而且 Customers 和 Orders 資料表會出現在 [資料來源] 視窗中。
將控制項加入至表單
您可以從 [資料來源] 視窗將項目拖曳至表單上,藉以建立資料繫結控制項。
若要在 Windows Form 上建立資料繫結控制項
在 [資料來源] 視窗中,展開 [Customers] 節點。
從 [資料來源] 視窗,將 [Customers] 主節點拖曳至 [Form1]。
DataGridView 控制項以及用於巡覽資料錄的工具區域 (BindingNavigator) 會出現在表單上。NorthwindDataSet、CustomersTableAdapter、BindingSource 和 BindingNavigator 則會出現在元件匣中。
將相關的 [Orders] 節點 ([Fax] 資料行底下的相關子資料表節點,而非 [Orders] 主節點) 拖曳至表單的 [CustomersDataGridView] 底下。
DataGridView 就會出現在表單上。OrdersTableAdapter 和 BindingSource 則出現在元件匣中。
加入 System.Transactions 組件的參考
交易會使用 System.Transactions 命名空間。根據預設,系統不會加入 system.transactions 組件的專案參考,所以您必須手動加入。
若要加入 System.Transactions DLL 檔的參考
在 [專案] 功能表中選擇 [加入參考]。
選取 [System.Transactions] (在 [.NET] 索引標籤中),然後按一下 [確定]。
[System.Transactions] 的參考就會加入專案中。
在 BindingNavigator 的 SaveItem 按鈕中修改程式碼
根據預設,若為第一個置放到表單上的資料表,程式碼就會加入 BindingNavigator 上儲存按鈕的 click 事件中。您必須手動加入程式碼,以便更新任何其他資料表。在這個逐步解說中,我們會從儲存按鈕的 Click 事件處理常式重構現有的儲存程式碼,然後建立一些方法,以便根據是否需要加入或刪除資料列,提供特定的更新功能。
若要修改自動產生的儲存程式碼
按兩下 [CustomersBindingNavigator] 上的 [儲存] 按鈕 (含有磁片圖示的按鈕)。
以下列程式碼取代 CustomersBindingNavigatorSaveItem_Click 方法:
Private Sub CustomersBindingNavigatorSaveItem_Click() Handles CustomersBindingNavigatorSaveItem.Click UpdateData() End Sub Private Sub UpdateData() Me.Validate() Me.CustomersBindingSource.EndEdit() Me.OrdersBindingSource.EndEdit() Using updateTransaction As New Transactions.TransactionScope DeleteOrders() DeleteCustomers() AddNewCustomers() AddNewOrders() updateTransaction.Complete() NorthwindDataSet.AcceptChanges() End Using End Sub
private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e) { UpdateData(); } private void UpdateData() { this.Validate(); this.customersBindingSource.EndEdit(); this.ordersBindingSource.EndEdit(); using (System.Transactions.TransactionScope updateTransaction = new System.Transactions.TransactionScope()) { DeleteOrders(); DeleteCustomers(); AddNewCustomers(); AddNewOrders(); updateTransaction.Complete(); northwindDataSet.AcceptChanges(); } }
對相關資料協調變更的順序如下:
刪除子資料錄 (在此情況中,從 Orders 資料表刪除資料錄)
刪除父資料錄 (在此情況中,從 Customers 資料表刪除資料錄)
插入父資料錄 (在此情況中,在 Customers 資料表中插入資料錄)
插入子資料錄 (在此情況中,在 Orders 資料表中插入資料錄)
若要刪除現有的訂單
將下列 DeleteOrders 方法加入到 Form1:
Private Sub DeleteOrders() Dim deletedOrders As NorthwindDataSet.OrdersDataTable deletedOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) If Not IsNothing(deletedOrders) Then Try OrdersTableAdapter.Update(deletedOrders) Catch ex As Exception MessageBox.Show("DeleteOrders Failed") End Try End If End Sub
private void DeleteOrders() { NorthwindDataSet.OrdersDataTable deletedOrders; deletedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Deleted); if (deletedOrders != null) { try { ordersTableAdapter.Update(deletedOrders); } catch (System.Exception ex) { MessageBox.Show("DeleteOrders Failed"); } } }
若要刪除現有的客戶
將下列 DeleteCustomers 方法加入到 Form1:
Private Sub DeleteCustomers() Dim deletedCustomers As NorthwindDataSet.CustomersDataTable deletedCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.CustomersDataTable) If Not IsNothing(deletedCustomers) Then Try CustomersTableAdapter.Update(deletedCustomers) Catch ex As Exception MessageBox.Show("DeleteCustomers Failed" & vbCrLf & ex.Message) End Try End If End Sub
private void DeleteCustomers() { NorthwindDataSet.CustomersDataTable deletedCustomers; deletedCustomers = (NorthwindDataSet.CustomersDataTable) northwindDataSet.Customers.GetChanges(DataRowState.Deleted); if (deletedCustomers != null) { try { customersTableAdapter.Update(deletedCustomers); } catch (System.Exception ex) { MessageBox.Show("DeleteCustomers Failed"); } } }
若要加入新的客戶
將下列 AddNewCustomers 方法加入到 Form1:
Private Sub AddNewCustomers() Dim newCustomers As NorthwindDataSet.CustomersDataTable newCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Added), NorthwindDataSet.CustomersDataTable) If Not IsNothing(newCustomers) Then Try CustomersTableAdapter.Update(newCustomers) Catch ex As Exception MessageBox.Show("AddNewCustomers Failed" & vbCrLf & ex.Message) End Try End If End Sub
private void AddNewCustomers() { NorthwindDataSet.CustomersDataTable newCustomers; newCustomers = (NorthwindDataSet.CustomersDataTable) northwindDataSet.Customers.GetChanges(DataRowState.Added); if (newCustomers != null) { try { customersTableAdapter.Update(newCustomers); } catch (System.Exception ex) { MessageBox.Show("AddNewCustomers Failed"); } } }
若要加入新的訂單
將下列 AddNewOrders 方法加入到 Form1:
Private Sub AddNewOrders() Dim newOrders As NorthwindDataSet.OrdersDataTable newOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) If Not IsNothing(newOrders) Then Try OrdersTableAdapter.Update(newOrders) Catch ex As Exception MessageBox.Show("AddNewOrders Failed" & vbCrLf & ex.Message) End Try End If End Sub
private void AddNewOrders() { NorthwindDataSet.OrdersDataTable newOrders; newOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Added); if (newOrders != null) { try { ordersTableAdapter.Update(newOrders); } catch (System.Exception ex) { MessageBox.Show("AddNewOrders Failed"); } } }
執行應用程式
若要執行應用程式
- 按下 F5 執行應用程式。
請參閱
工作
概念
Enlisting in Distributed Transactions
Leveraging System.Transactions