将数据保存到 .NET Framework 应用程序中的数据库(多个表)

注释

此类 DataSet 和相关类是 2000 年代初的旧版 .NET Framework 技术,使应用程序能够在应用与数据库断开连接时处理内存中的数据。 这些技术对于使用户能够修改数据并将更改保留回数据库的应用特别有用。 尽管数据集是经过证实的成功技术,但新 .NET 应用程序的建议方法是使用 Entity Framework Core。 Entity Framework 提供了一种更自然的方式来将表格数据用作对象模型,并且具有更简单的编程接口。

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

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

本演练涉及以下任务:

先决条件

若要完成本教程,需要 .NET 桌面开发和数据存储以及处理 Visual Studio 中安装的工作负载。 若要安装它们,请打开 Visual Studio 安装程序,然后选择要修改的 Visual Studio 版本旁边的 修改(或 更多>修改)。 请参阅修改 Visual Studio

本演练使用 SQL Server Express LocalDB 和 Northwind 示例数据库。

  1. 如果没有 SQL Server Express LocalDB,请从 SQL Server Express 下载页或通过 Visual Studio 安装程序安装它。 在 Visual Studio 安装程序中,可以将 SQL Server Express LocalDB 作为 数据存储和处理 工作负荷的一部分或作为单个组件安装。

  2. 按照以下步骤安装 Northwind 示例数据库:

    1. 在 Visual Studio 中,打开 SQL Server 对象资源管理器 窗口。 (在 Visual Studio 安装程序中 SQL Server 对象资源管理器作为数据存储和处理工作负载的一部分安装。)展开 SQL Server 节点。 右键单击 LocalDB 实例并选择“新建查询”

      此时会打开查询编辑器窗口。

    2. Northwind Transact-SQL 脚本 复制到剪贴板。 此 T-SQL 脚本从头开始创建 Northwind 数据库,并使用数据填充该数据库。

    3. 将 T-SQL 脚本粘贴到查询编辑器中,然后选择 “执行” 按钮。

      短时间后,查询将完成运行并创建 Northwind 数据库。

创建 Windows 窗体应用程序

为 C# 或 Visual Basic 创建新的 Windows 窗体应用 项目。 将项目 命名为 UpdateMultipleTablesWalkthrough

创建数据源

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

  1. “数据 ”菜单上,选择“ 显示数据源”。

    此时会打开 “数据源 ”窗口。

  2. “数据源 ”窗口中,选择“ 添加新数据源 ”以启动 数据源配置向导

  3. 在“ 选择数据源类型” 屏幕上,选择“ 数据库”,然后选择“ 下一步”。

  4. “选择数据连接 ”屏幕上,执行下列作之一:

    • 如果下拉列表中提供了与 Northwind 示例数据库的数据连接,请选择它。

      -或-

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

  5. 如果数据库需要密码,请选择包含敏感数据的选项,然后选择“ 下一步”。

  6. “将连接字符串保存到应用程序配置文件”上,选择“ 下一步”。

  7. “选择数据库对象 ”屏幕上,展开 “表” 节点。

  8. 选择 “客户 ”和“ 订单 ”表,然后选择“ 完成”。

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

设置要创建的控件

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

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

  1. “数据源 ”窗口中,展开 “客户 ”节点。

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

创建数据绑定窗体

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

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

    带有描述性标签的数据绑定控件显示在窗体上,另有用于导航记录的工具栏(BindingNavigator)。 NorthwindDataSetCustomersTableAdapterBindingSourceBindingNavigator出现在组件托盘中。

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

    注释

    相关 “订单” 节点位于 “传真 ”列下方,是 “客户” 节点的子节点。

    用于导航记录的 DataGridView 控件和工具栏(BindingNavigator)将显示在窗体上。 组件托盘中会显示一个OrdersTableAdapter和一个BindingSource

添加代码以更新数据库

可以通过调用 UpdateCustomersOrders TableAdapters 的方法来更新数据库。 默认情况下,将为窗体代码添加 “保存” 按钮BindingNavigator 的事件处理程序,以便向数据库发送更新。 此过程修改代码以正确的顺序发送更新。这消除了引发引用完整性错误的可能性。 该代码还通过将更新调用包装在 try-catch 块中来实现错误处理。 可以修改代码以满足应用程序的需求。

注释

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

向应用程序添加更新逻辑

  1. 选择 “保存”按钮。BindingNavigator 这会打开bindingNavigatorSaveItem_Click事件处理程序的代码编辑器。

  2. 替换事件处理程序中的代码以调用 Update 相关 TableAdapters 的方法。 以下代码首先创建三个临时数据表来保存每个DataRowStateDeletedAddedModified)的更新信息。 更新按正确的顺序运行。 代码应如下所示:

    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. 检查数据库中的值以验证是否已保存更改。