逐步解說:在異動中儲存資料
發行︰ 2016年4月
此逐步解說示範如何使用 System.Transactions 命名空間儲存交易中的資料。 此範例使用 Northwind 範例資料庫的 Customers
和 Orders
資料表。
必要條件
此逐步解說需要 Northwind 範例資料庫的存取權。 如需設定 Northwind 範例資料庫的資訊,請參閱 如何:安裝範例資料庫。
建立 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 檔案的參考
從 [專案] 功能表選擇 [加入參考]。
選取 [.NET] 索引標籤上的 [System.Transactions],並按一下 [確定]。
隨即會將 System.Transactions 的參考加入至專案。
修改 BindingNavigator 的 SaveItem 按鈕中的程式碼
根據預設,會針對您拖放至表單的第一個資料表,將程式碼將入至 BindingNavigator 的相同按鈕的 click
事件。 您必須手動加入程式碼以更新所有其他資料表。 在此逐步解說中,要從儲存按鈕的按一下事件處理常式重構現有儲存程式碼,並多建立幾個方法,以根據是否要加入或刪除資料列提供特定更新功能。
修改自動產生的儲存程式碼
按兩下 CustomersBindingNavigator 上的 [儲存] 按鈕 (具有磁碟片圖示的按鈕)。
以下列程式碼取代
CustomersBindingNavigatorSaveItem_Click
方法: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(); } }
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
對關聯資料變更的協調順序如下:
刪除子記錄 (在此情況中,從
Orders
資料表刪除記錄)刪除父記錄 (在此情況中,從
Customers
資料表刪除記錄)插入父記錄 (在此情況中,將記錄插入
Customers
資料表)插入子記錄 (在此情況中,將記錄插入
Orders
資料表)
刪除現有訂單
將下列
DeleteOrders
方法加入至 Form1: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"); } } }
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
刪除現有客戶
將下列
DeleteCustomers
方法加入至 Form1: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"); } } }
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
加入新客戶
將下列
AddNewCustomers
方法加入至 Form1: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"); } } }
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
加入新訂單
將下列
AddNewOrders
方法加入至 Form1: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"); } } }
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
執行應用程式
若要執行應用程式
- 按 F5 執行應用程式。
請參閱
交易和並行
Oracle 分散式交易
如何:使用異動儲存資料
System.Transactions 與 SQL Server 整合
連接至 Visual Studio 中的資料
準備您的應用程式以接收資料
將資料擷取至您的應用程式中
將控制項繫結至 Visual Studio 中的資料
在您的應用程式中編輯資料
驗證資料
儲存資料