演练:将数据保存到数据库(多个表)
应用程序开发中最常用方案之一是在 Windows 应用程序窗体中显示数据、编辑数据并将更新后的数据发回数据库。 本演练创建可显示两个相关表的数据的窗体,并演示如何编辑记录和将更改保存回数据库。 此示例使用源自 Northwind 示例数据库的 Customers 和 Orders 表。
通过调用 TableAdapter 的 Update 方法,可以将应用程序中的数据保存回数据库。 当从**“数据源”**窗口拖动项时,为拖放到窗体上的第一个表自动添加保存数据的代码。 添加到窗体的任何其他表都要求手动添加保存数据所需的所有代码。 本演练演示如何添加从多个表保存更新的代码。
备注
显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 Visual Studio 设置。
本演练涉及以下任务:
创建新的**“Windows 应用程序”**项目。
使用 数据源配置向导 在应用程序中创建和配置数据源。
在 “数据源”窗口 中设置项的控件。 有关更多信息,请参见如何:设置从“数据源”窗口中拖动时要创建的控件。
通过将某些项从**“数据源”**窗口拖到您的窗体上来创建数据绑定控件。
修改数据集的每个表中的若干条记录。
修改用于将数据集中的更新数据发送回数据库的代码。
系统必备
若要完成本演练,您需要:
- 对 Northwind 示例数据库的访问权。 有关更多信息,请参见 如何:安装示例数据库。
创建 Windows 应用程序
第一步是创建**“Windows 应用程序”**。 在此步骤中为项目指定名称是可选的,但由于我们打算稍后保存该项目,因此为它指定了一个名称。
创建新的 Windows 应用程序项目
从**“文件”**菜单创建一个新的项目。
将项目命名为 UpdateMultipleTablesWalkthrough。
选择**“Windows 应用程序”,然后单击“确定”**。 有关更多信息,请参见 开发客户端应用程序。
UpdateMultipleTablesWalkthrough 项目即被创建并添加到**“解决方案资源管理器”**中。
创建数据源
此步骤使用**“数据源配置向导”**从 Northwind 数据库创建一个数据源。 必须具有访问 Northwind 示例数据库的权限才能创建连接。 有关设置 Northwind 示例数据库的信息,请参见 如何:安装示例数据库。
创建数据源
在**“数据”菜单上,单击“显示数据源”**。
在**“数据源”窗口中,单击“添加新数据源”启动“数据源配置向导”**。
在**“选择数据源类型”页上选择“数据库”,然后单击“下一步”**。
在**“选择您的数据连接”**页面上执行下列操作之一:
如果下拉列表中包含到 Northwind 示例数据库的数据连接,请选择该连接。
- 或 -
选择**“新建连接”,打开“添加/修改连接”**对话框。 有关更多信息,请参见“添加/修改连接”对话框(通用)。
如果数据库需要密码,请选择该选项以包括敏感数据,再单击**“下一步”**。
在**“将连接字符串保存到应用程序配置文件”页面上单击“下一步”**。
在**“选择数据库对象”页面上展开“表”**节点。
选择**“Customers”和“Orders”表,然后单击“完成”**。
**“NorthwindDataSet”被添加到您的项目,这些表将出现在“数据源”**窗口中。
设置要创建的控件
对于本演练,Customers 表中的数据将处于**“详细信息”布局(数据在单独控件中显示)。 来自 Orders 表的数据将处于“网格”**布局(在 DataGridView 控件中显示)。
设置数据源窗口中项的放置类型
在**“数据源”窗口中展开“Customers”**节点。
通过从**“Customers”节点上的控件列表中选择“详细信息”,将“Customers”**表中的控件更改为单独的控件。 有关更多信息,请参见如何:设置从“数据源”窗口中拖动时要创建的控件。
创建数据绑定窗体
可以通过将某些项从**“数据源”**窗口拖到您的窗体上来创建数据绑定控件。
在窗体上创建数据绑定控件
将主**“Customers”节点从“数据源”窗口拖到“Form1”**上。
带有描述性标签的数据绑定控件会出现在窗体上,同时还显示一个工具条 (BindingNavigator),用于在记录间进行导航。 组件栏中出现 NorthwindDataSet、CustomersTableAdapter、BindingSource 和 BindingNavigator。
将相关的**“Orders”节点从“数据源”窗口拖动到“Form1”**上。
备注
相关的“Orders”节点位于“Fax”列下,该节点是“Customers”节点的子节点。
用于导航记录的 DataGridView 控件和工具栏(BindingNavigator)出现在窗体上。 OrdersTableAdapter 和 BindingSource 出现在组件栏中。
添加用于更新数据库的代码
通过调用**“Customers”和“Orders”TableAdapter 的 Update 方法可以更新数据库。 默认情况下,BindingNavigator 的“保存”**按钮的事件处理程序被添加到窗体代码中,以将更新内容发送到数据库。 本过程将修改该代码以按正确的顺序发送更新内容,从而消除产生引用完整性错误的可能性。 该代码还将通过在 try-catch 块中包装更新调用来实现错误处理。 可以根据应用程序的需要修改代码。
备注
为了清楚起见,本演练未使用事务,但是如果您要更新两个或多个相关表,则应在一个事务中包含所有更新逻辑。事务是指一个过程,它首先确保对数据库的所有相关更改均可成功完成,然后再提交更改。有关更多信息,请参见 Performing Transactions。
向应用程序添加更新逻辑
在 BindingNavigator 上双击**“保存”**按钮,打开代码编辑器并转到 bindingNavigatorSaveItem_Click 事件处理程序。
替换事件处理程序中的代码以调用相关 TableAdapter 的 Update 方法。 下面的代码首先创建三个临时数据表以保存每个 DataRowState 的更新信息(Deleted、Added 和 Modified)。 然后,按正确的顺序执行更新。 代码应类似于:
Me.Validate() Me.OrdersBindingSource.EndEdit() Me.CustomersBindingSource.EndEdit() Dim deletedOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) Dim newOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) Dim modifiedOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable) Try ' Remove all deleted orders from the Orders table. If Not deletedOrders Is Nothing Then OrdersTableAdapter.Update(deletedOrders) End If ' Update the Customers table. CustomersTableAdapter.Update(NorthwindDataSet.Customers) ' Add new orders to the Orders table. If Not newOrders Is Nothing Then OrdersTableAdapter.Update(newOrders) End If ' Update all modified Orders. If Not modifiedOrders Is Nothing Then OrdersTableAdapter.Update(modifiedOrders) End If NorthwindDataSet.AcceptChanges() Catch ex As Exception MsgBox("Update failed") Finally If Not deletedOrders Is Nothing Then deletedOrders.Dispose() End If If Not newOrders Is Nothing Then newOrders.Dispose() End If If Not modifiedOrders Is Nothing Then modifiedOrders.Dispose() End If End Try
this.Validate(); this.ordersBindingSource.EndEdit(); this.customersBindingSource.EndEdit(); NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Deleted); NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Added); NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Modified); try { // Remove all deleted orders from the Orders table. if (deletedOrders != null) { ordersTableAdapter.Update(deletedOrders); } // Update the Customers table. customersTableAdapter.Update(northwindDataSet.Customers); // Add new orders to the Orders table. if (newOrders != null) { ordersTableAdapter.Update(newOrders); } // Update all modified Orders. if (modifiedOrders != null) { ordersTableAdapter.Update(modifiedOrders); } northwindDataSet.AcceptChanges(); } catch (System.Exception ex) { MessageBox.Show("Update failed"); } finally { if (deletedOrders != null) { deletedOrders.Dispose(); } if (newOrders != null) { newOrders.Dispose(); } if (modifiedOrders != null) { modifiedOrders.Dispose(); } }
测试应用程序
测试应用程序
按 F5。
对每个表中的一条或多条记录的数据执行一些更改。
按**“保存”**按钮。
检查数据库中的值以验证更改已保存。
后续步骤
根据应用程序的要求,在 Windows 应用程序中创建了绑定数据窗体后,还需要执行一些步骤。 您可以通过以下操作来增强此演练的效果:
在窗体上添加搜索功能。 有关更多信息,请参见 如何:向 Windows 窗体应用程序中添加参数化查询。
编辑数据源以添加或移除数据库对象。 有关更多信息,请参见如何:编辑数据集。
请参见
概念
Visual Studio 2012 中针对数据应用程序开发的新增功能
在 Visual Studio 中将 Windows 窗体控件绑定到数据