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

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

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

说明说明

显示的对话框和菜单命令可能会与“帮助”中的描述不同,具体取决于您现用的设置或版本。若要更改设置,请在“工具”菜单上选择“导入和导出设置”。有关更多信息,请参见 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 块中包装更新调用来实现错误处理。可以根据应用程序的需要修改代码。

说明说明

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

向应用程序添加更新逻辑

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

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

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

测试应用程序

测试应用程序

  1. 按 F5。

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

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

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

后续步骤

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

请参见

概念

Visual Studio 2012 中针对数据应用程序开发的新增功能

在 Visual Studio 中将 Windows 窗体控件绑定到数据

准备应用程序以接收数据

将数据获取到应用程序

在 Visual Studio 中将控件绑定到数据

在应用程序中编辑数据

验证数据

保存数据

其他资源

数据演练

Visual Studio 的数据应用程序概述

连接到 Visual Studio 中的数据