演练:将数据保存到数据库(多个表)

 

发布日期: 2016年7月

应用程序开发中最常用方案之一是在 Windows 应用程序窗体上显示数据、编辑数据并将更新后的数据发回数据库。 本演练创建可显示两个相关表的数据的窗体,并显示如何编辑记录和将更改保存回数据库。 此示例使用源自 Northwind 示例数据库的 CustomersOrders 表。

通过调用 TableAdapter 的 Update 方法,可以将应用程序中的数据保存回数据库。 当从**“数据源”**窗口拖动项时,为拖放到窗体上的第一个表自动添加保存数据的代码。 添加到窗体的任何其他表都要求手动添加保存数据所需的所有代码。 本演练显示了如何添加从多个表保存更新的代码。

备注

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于你现用的设置或版本。 若要更改设置,请在“工具”菜单上选择“导入和导出设置”。 有关详细信息,请参阅Customizing Development Settings in Visual Studio

本演练涉及以下任务:

系统必备

若要完成本演练,你将需要:

创建 Windows 应用程序

第一步是创建**“Windows 应用程序”**。 在此步骤中为项目指定名称是可选的,但由于我们打算稍后保存该项目,因此为它指定了一个名称。

创建新的 Windows 应用程序项目

  1. 从**“文件”**菜单创建一个新的项目。

  2. 将项目命名为 UpdateMultipleTablesWalkthrough

  3. 选择**“Windows 应用程序”,然后单击“确定”**。 有关详细信息,请参阅客户端应用程序

    **“UpdateMultipleTablesWalkthrough”项目即被创建并添加到“解决方案资源管理器”**中。

创建数据源

此步骤使用**“数据源配置向导”**从 Northwind 数据库创建一个数据源。 你必须具有对 Northwind 示例数据库的访问权限,才能创建连接。 有关设置 Northwind 示例数据库的信息,请参阅如何:安装示例数据库

创建数据源

  1. 在**“数据”菜单上,单击“显示数据源”**。

  2. 在**“数据源”窗口中,单击“添加新数据源”以启动“数据源配置向导”**。

  3. 在**“选择数据源类型”页上选择“数据库”,然后单击“下一步”**。

  4. 在**“选择你的数据连接”**页面上,执行以下操作之一:

    • 如果下拉列表中包含到 Northwind 示例数据库的数据连接,请选择该连接。

      - 或 -

    • 选择**“新建连接”以打开“添加/修改连接”**对话框。

  5. 如果数据库需要密码,请选择该选项以包括敏感数据,再单击**“下一步”**。

  6. 在**“将连接字符串保存到应用程序配置文件”页面上单击“下一步”**。

  7. 在**“选择数据库对象”页面上展开“表”**节点。

  8. 选择**“Customers”“Orders”表,然后单击“完成”**。

    **“NorthwindDataSet”将添加到你的项目,这些表将显示在“数据源”**窗口中。

设置要创建的控件

对于本演练,Customers 表中的数据将位于**“详细信息”布局(数据在单独控件中显示)中。 来自 Orders 表的数据将位于“网格”**布局(在 DataGridView 控件中显示)中。

设置“数据源”窗口中项的拖放类型

  1. 在**“数据源”窗口中展开“Customers”**节点。

  2. 通过从**“Customers”节点上的控件列表中选择“详细信息”,将“Customers”**表中的控件更改为单个控件。 有关详细信息,请参阅设置从“数据源”窗口中拖动时要创建的控件

创建数据绑定窗体

通过将某些项从**“数据源”**窗口拖到你的窗体上,可创建数据绑定控件。

在窗体上创建数据绑定控件

  1. 将主**“Customers”节点从“数据源”窗口拖到“Form1”**上。

    带有描述性标签的数据绑定控件将显示在窗体上,同时还显示一个工具条 (BindingNavigator),用于在记录间进行导航。 组件栏中出现 NorthwindDataSetCustomersTableAdapterBindingSourceBindingNavigator

  2. 将相关的**“Orders”节点从“数据源”窗口拖到“Form1”**上。

    备注

    相关的“Orders”节点位于“Fax”列下,该节点是“Customers”节点的子节点。

    用于导航记录的 DataGridView 控件和工具栏(BindingNavigator)将显示在窗体上。 OrdersTableAdapterBindingSource 将显示在组件栏中。

添加用于更新数据库的代码

通过调用**“Customers”“Orders”TableAdapter 的 Update 方法,可更新数据库。 默认情况下,BindingNavigator“保存”**按钮的事件处理程序将添加到窗体代码中,以将更新内容发送到数据库。 本过程将修改该代码以按正确的顺序发送更新内容,从而消除产生引用完整性错误的可能性。 该代码还将通过在 try-catch 块中包装更新调用来实现错误处理。 可以根据应用程序的需要修改代码。

备注

为了清楚起见,本演练未使用事务,但是如果你要更新两个或多个相关表,则应在一个事务中包含所有更新逻辑。 事务是指一个过程,它首先确保对数据库的所有相关更改均可成功完成,然后再提交更改。 有关详细信息,请参阅事务和并发

将更新逻辑添加到应用程序

  1. BindingNavigator 上双击**“保存”**按钮,以打开代码编辑器并转到 bindingNavigatorSaveItem_Click 事件处理程序。

  2. 替换事件处理程序中的代码以调用相关 TableAdapter 的 Update 方法。 下面的代码首先创建三个临时数据表以保存每个 DataRowState 的更新信息(DeletedAddedModified)。 然后,按正确的顺序执行更新。 代码应类似于:

                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();
                    }
                }
    
            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
    

测试应用程序

测试应用程序

  1. 按 F5。

  2. 对每个表中的一条或多条记录的数据执行一些更改。

  3. 按**“保存”**按钮。

  4. 检查数据库中的值以验证更改是否已保存。

后续步骤

根据应用程序的要求,在 Windows 应用程序中创建了绑定数据窗体后,还需要执行一些步骤。 你可以通过以下操作来增强此演练的效果:

请参阅

数据演练
在 Visual Studio 中将 Windows 窗体控件绑定到数据
Visual Studio 的数据应用程序概述
连接到 Visual Studio 中的数据
准备应用程序以接收数据
将数据获取到应用程序
在 Visual Studio 中将控件绑定到数据
在应用程序中编辑数据
验证数据
保存数据