使用 Tableadapter 填充数据集

使用 Tableadapter 填充数据集

TableAdapter 组件根据指定的一个或多个查询或存储过程,使用数据库中的数据填充数据集。 Tableadapter 还可以对数据库执行添加、更新和删除操作,以便保存对数据集所做的更改。 还可以发出与任何特定表无关的全局命令。

 备注

Tableadapter 由 Visual Studio 设计器生成。 如果要以编程方式创建数据集,请使用 DataAdapter,这是一个 .NET 类。

有关 TableAdapter 操作的详细信息,可以直接跳到以下主题之一:

表 1
主题说明
创建和配置 TableAdapter 如何使用设计器创建和配置 Tableadapter
创建参数化 TableAdapter 查询 如何使用户能够为 TableAdapter 过程或查询提供参数
使用 TableAdapter 直接访问数据库 如何使用 Tableadapter 的 Dbdirect 方法
在填充数据集时关闭约束 如何在更新数据时使用 foreign key 约束
如何:扩展 TableAdapter 的功能 如何将自定义代码添加到 Tableadapter
将 XML 数据读入数据集 如何使用 XML

TableAdapter 概述

Tableadapter 是由设计器生成的组件,用于连接到数据库、运行查询或存储过程,并使用返回的数据填充其 DataTable。 Tableadapter 还会将更新的数据从应用程序发送回数据库。 可以在 TableAdapter 上运行任意多个查询,前提是这些查询返回的数据符合与 TableAdapter 关联的表的架构。 下图显示了 Tableadapter 如何与数据库和内存中的其他对象进行交互:

客户端应用程序中的数据流

尽管 Tableadapter 是用数据集设计器设计的,但 TableAdapter 类不会生成为的嵌套类 DataSet 。 它们位于特定于每个数据集的不同命名空间中。 例如,如果你有一个名为的数据集 NorthwindDataSet ,则与中的关联的 tableadapter 将 DataTable NorthwindDataSet 在 NorthwindDataSetTableAdapters 命名空间中。 若要以编程方式访问特定 TableAdapter,必须声明 TableAdapter 的新实例。 例如:

C#
NorthwindDataSet northwindDataSet = new NorthwindDataSet();

NorthwindDataSetTableAdapters.CustomersTableAdapter customersTableAdapter = 
    new NorthwindDataSetTableAdapters.CustomersTableAdapter();

customersTableAdapter.Fill(northwindDataSet.Customers);

关联的 DataTable 架构

创建 TableAdapter 时,使用初始查询或存储过程来定义 TableAdapter 关联的架构 DataTable 。 可以通过调用 TableAdapter 的 Fill 方法(填充 tableadapter 的关联)来运行此初始查询或存储过程 DataTable 。 对 TableAdapter 的主查询所做的任何更改都会反映在关联数据表的架构中。 例如,从主查询中删除列还会从关联的数据表中删除列。 如果针对 TableAdapter 的任何附加查询使用 SQL 语句来返回主查询中不存在的列,则设计器将尝试同步主查询与其他查询之间的列更改。

TableAdapter 更新命令

TableAdapter 的更新功能取决于在Tableadapter 向导的主查询中提供了多少信息。 例如,配置为从多个表中提取值的 Tableadapter (使用 JOIN )、标量值、视图或聚合函数的结果,最初不能将更新发送回底层数据库。 但是,你可以 INSERT UPDATE DELETE 在 "属性" 窗口中手动配置、和命令。

TableAdapter 查询

带有多个查询的 TableAdapter

Tableadapter 可包含多个查询来填充关联的数据表。 您可以根据应用程序的需要为 TableAdapter 定义任意多个查询,前提是每个查询都返回与其关联数据表具有相同架构的数据。 此功能使 TableAdapter 能够根据不同的条件加载不同的结果。

例如,如果您的应用程序包含包含客户名称的表,则您可以创建一个查询,该查询使用以特定字母开头的每个客户名称来填充表,而另一个则使用处于相同状态的所有客户填充该表。 若要 Customers 使用处于给定状态的客户填充表,可以创建一个 FillByState 查询,该查询采用状态值的参数,如下所示: SELECT * FROM Customers WHERE State = @State 。 可以通过调用 FillByState 方法并传入参数值来运行查询,如下所示: CustomerTableAdapter.FillByState("WA") 。

除了添加返回与 TableAdapter 的数据表相同的架构数据的查询之外,还可以添加返回标量(单)值的查询。 例如,如果 SELECT Count(*) From Customers CustomersTableAdapter, 返回的数据不符合表的架构,则返回客户计数()的查询对于有效。

ClearBeforeFill 属性

默认情况下,每次运行查询以填充 TableAdapter 的数据表时,现有数据会被清除,并且仅将查询的结果加载到表中。 ClearBeforeFill false 如果要将从查询返回的数据添加或合并到数据表中的现有数据,请将 TableAdapter 的属性设置为。 不管是否清除数据,都需要将更新显式发送回数据库(如果要保存这些更新)。 因此,请记住在运行填充表的另一个查询之前保存对表中数据所做的任何更改。 有关详细信息,请参阅使用 TableAdapter 更新数据

TableAdapter 继承

Tableadapter 通过封装配置的类来扩展标准数据适配器的功能 DataAdapter 。 默认情况下,TableAdapter 从类继承 Component ,不能转换为 DataAdapter 类。 将 TableAdapter 转换为 DataAdapter 类会导致 InvalidCastException 错误。 若要更改 TableAdapter 的基类,可以指定从 Component 数据集设计器中的 Tableadapter 的 "基类" 属性派生的类。

TableAdapter 方法和属性

TableAdapter 类不是 .NET 类型。 这意味着不能在文档或对象浏览器中查找。 它在设计时使用前面提到的向导之一创建。 根据所使用的表的名称,在创建时分配给 TableAdapter 的名称。 例如,基于名为的数据库中的表创建 TableAdapter 时 Orders ,tableadapter 的名称为 OrdersTableAdapter 。 可以使用数据集设计器中的 "名称" 属性更改 TableAdapter 的类名。

下面是 Tableadapter 的常用方法和属性:

TABLEADAPTER 方法和属性
成员描述
TableAdapter.Fill 用 TableAdapter 的命令的结果填充 TableAdapter 的关联数据表 SELECT 。
TableAdapter.Update 将更改发送回数据库,并返回一个整数,该整数表示受更新影响的行数。 有关详细信息,请参阅使用 TableAdapter 更新数据
TableAdapter.GetData 返回填充了 DataTable 数据的新。
TableAdapter.Insert 在数据表中创建新行。 有关详细信息,请参阅在数据库中插入新记录
TableAdapter.ClearBeforeFill 确定在调用方法之一之前是否清空数据表 Fill 。

TableAdapter 更新方法

Tableadapter 使用数据命令从数据库中读取和写入数据。 使用 TableAdapter 的初始 Fill (main)查询作为创建关联数据表的架构的基础,以及 InsertCommand UpdateCommand DeleteCommand 与方法相关联的、、和命令 TableAdapter.Update 。 调用 TableAdapter 的 Update 方法会运行最初配置 TableAdapter 时创建的语句,而不是使用TableAdapter 查询配置向导添加的其他查询之一。

使用 TableAdapter 时,它会有效地执行与通常会执行的命令相同的操作。 例如,当您调用适配器的方法时 Fill ,适配器会在其属性中运行数据命令 SelectCommand ,并使用数据读取器(例如 SqlDataReader )将结果集加载到数据表中。 同样,在调用适配器的方法时 Update ,它会 UpdateCommand InsertCommand DeleteCommand 为数据表中的每个已更改的记录运行相应的命令(在、和属性中)。

 备注

如果主查询中有足够的信息,则 InsertCommand 默认情况下,在 UpdateCommand DeleteCommand 生成 TableAdapter 时,会创建、和命令。 如果 TableAdapter 的主查询多於单个表 SELECT 语句,设计器可能无法生成 InsertCommand 、 UpdateCommand 和 DeleteCommand 。 如果未生成这些命令,则在运行该方法时可能会收到错误 TableAdapter.Update 。

TableAdapter GenerateDbDirectMethods

除了 InsertCommand 、和以外 UpdateCommand ,还 DeleteCommand 可以通过对数据库直接运行的方法创建 tableadapter。 您可以直接调用这些方法( TableAdapter.Insert 、 TableAdapter.Update 和 TableAdapter.Delete )来操作数据库中的数据。 这意味着你可以从代码中调用这些单独的方法,而不是调用 TableAdapter.Update 来处理为关联数据表挂起的插入、更新和删除操作。

如果不想创建这些直接方法,请将 TableAdapter 的GenerateDbDirectMethods属性设置为 false (在 "属性" 窗口中)。 添加到 TableAdapter 的其他查询是独立查询,它们不会生成这些方法。

TableAdapter 支持可以为 null 的类型

Tableadapter 支持可以为 null Nullable(Of T) 的类型和 T? 。 若要深入了解 Visual Basic 中可以为 null 的类型,请参阅可以为 null 的值类型。 有关 c # 中可以为 null 的类型的详细信息,请参阅使用可以为 null 的类型

TableAdapterManager 引用

默认情况下,当您创建包含相关表的数据集时,TableAdapterManager 类将生成。 若要防止生成类,请将 Hierarchical Update 数据集的属性值更改为 false。 将具有关系的表拖到 Windows 窗体或 WPF 页的设计图面上时,Visual Studio 将声明类的成员变量。 如果不使用数据绑定,则必须手动声明该变量。

TableAdapterManager 类不是 .NET 类型。 因此,您不能在文档中查找它。 它在设计时创建,作为数据集创建过程的一部分。

下面是类的常用方法和属性 TableAdapterManager :

TABLEADAPTERMANAGER 引用
成员描述
UpdateAll 方法 保存所有数据表中的所有数据。
BackUpDataSetBeforeUpdate 属性 确定在执行方法之前是否创建数据集的备份副本 TableAdapterManager.UpdateAll 。变量.
tableName TableAdapter知识产权 表示 TableAdapter。 生成的 TableAdapterManager 包含其管理的每个属性的属性 TableAdapter 。 例如,具有 Customers 和 Orders 表的数据集将生成包含和属性的 TableAdapterManager CustomersTableAdapter OrdersTableAdapter 。
UpdateOrder 属性 控制单个 insert、update 和 delete 命令的顺序。 将此项设置为枚举中的值之一 TableAdapterManager.UpdateOrderOption 。

默认情况下, UpdateOrder 设置为InsertUpdateDelete。 这意味着对数据集中的所有表执行 insert、update 和 delete 操作。

安全性

如果使用的数据命令的 CommandType 属性设置为 Text ,请在将客户端传递到数据库之前,仔细检查从该客户端发送的信息。 恶意用户会设法发送(注入)经过修改或附加的 SQL 语句,企图对数据库进行未经授权的访问或破坏数据库。 将用户输入传输到数据库之前,请始终验证信息是否有效。 最佳做法是尽可能使用参数化查询或存储过程。


 

N 层数据应用程序概述

N 层数据应用程序是分为多个的数据应用程序。 也称为 "分布式应用程序" 和 "多层应用程序",n 层应用程序将处理单独处理到在客户端和服务器之间分布的离散层。 开发访问数据的应用程序时,应在构成应用程序的各个层之间明确分隔。

典型的 n 层应用程序包括一个表示层、一个中间层和一个数据层。 分隔 n 层应用程序中各个层的最简单方法是为每个要包括在应用程序中的层创建不同的项目。 例如,表示层可能是 Windows 窗体应用程序,而数据访问逻辑可能是位于中间层的类库。 此外,表示层可以通过服务(如 web 服务)与中间层中的数据访问逻辑通信。 将应用程序组件分离到不同的层可提高应用程序的可维护性和可伸缩性。 为实现此功能,可更轻松地采用可应用於单个层的新技术,而无需重新设计整个解决方案。 此外,n 层应用程序通常将敏感信息存储在中间层中,这会保持与表示层的隔离。

Visual Studio 包含多项功能,可帮助开发人员创建 n 层应用程序:

  • 数据集提供了一个数据集项目属性,使你能够将数据集(数据实体层)和 tableadapter (数据访问层)分成不同的项目。

  • Visual Studio 中的 LINQ to SQL 工具提供了用于将 DataContext 和数据类生成到单独命名空间中的设置。 这可以实现数据访问层和数据实体层的逻辑分离。

  • LINQ to SQL提供了一 Attach 种方法,使你可以将应用程序中不同层的 DataContext 组合在一起。 有关详细信息,请参阅具有 LINQ to SQL 的 N 层和远程应用程序

表示层

呈现层是用户与应用程序进行交互的层。 它通常还包含其他应用程序逻辑。 典型的表示层组件包括:

呈现层通常使用服务引用访问中间层(例如,在 Visual Studio 应用程序中 Windows Communication Foundation 服务和 WCF 数据服务)。 呈现层不直接访问数据层。 呈现层通过中间层中数据访问组件的方式与数据层通信。

中间层

中间层是表示层和数据层用来相互通信的层。 典型的中间层组件包括:

  • 业务逻辑,如业务规则和数据验证。

  • 数据访问组件和逻辑,如下所示:

下图显示了 Visual Studio 中可用的功能和技术,以及它们可能适合于 n 层应用程序的中间层的位置。

中间层组件  中间层

中间层通常使用数据连接连接到数据层。 此数据连接通常存储在数据访问组件中。

数据层

数据层基本上是存储应用程序数据的服务器(例如运行 SQL Server 的服务器)。

下图显示了 Visual Studio 中可用的功能和技术,以及它们可能适合 n 层应用程序的数据层的位置。

数据层组件  数据层

数据层无法直接从表示层中的客户端访问。 中间层中的数据访问组件用于表示层和数据层之间的通信。

N 层开发帮助

以下主题提供有关使用 n 层应用程序的信息:

将数据集和 Tableadapter 分隔到不同的项目中

演练:创建 n 层数据应用程序

N 层和远程应用程序与 LINQ to SQL

请参阅


 

将数据集和 TableAdapter 分离到不同的项目中

已对类型化的数据集进行了增强,以便可以将tableadapter和 dataset 类生成到单独的项目中。 这使你能够快速分离应用程序层并生成 n 层数据应用程序。

下面的过程介绍使用数据集设计器将数据集代码生成到与包含生成的 TableAdapter 代码的项目不同的项目中的过程。

单独的数据集和 Tableadapter

将数据集代码与 TableAdapter 代码分离时,包含数据集代码的项目必须位于当前解决方案中。 如果此项目不在当前解决方案中,则它将不会出现在 "属性" 窗口的 "数据集项目" 列表中。

 备注

本文中的某些 Visual Studio 用户界面元素在计算机上出现的名称或位置可能会不同。 你可能正在使用其他版本的 Visual Studio 或其他环境设置。 有关详细信息,请参阅个性化设置 IDE

将数据集分隔到不同的项目中

  1. 打开包含数据集的解决方案(.xsd文件)。

     备注

    如果解决方案不包含要将数据集代码分离到其中的项目,请创建项目,或者将现有项目添加到解决方案中。

  2. 双击解决方案资源管理器中的类型化数据集文件( .xsd文件)以打开数据集设计器中的数据集。

  3. 选择数据集设计器的空白区域。

  4. 在 "属性" 窗口中,找到 "数据集项目" 节点。

  5. 在 "数据集项目" 列表中,选择要在其中生成数据集代码的项目的名称。

    选择要在其中生成数据集代码的项目后,将使用默认文件名填充 "数据集文件" 属性。 如果需要,可以更改此名称。 此外,如果想要将数据集代码生成到特定目录中,则可以将 "项目文件夹" 属性设置为文件夹的名称。

     备注

    分离数据集和 Tableadapter (通过设置 "数据集项目" 属性)时,不会自动移动项目中的现有部分数据集类。 必须将现有部分数据集类手动移动到数据集项目。

  6. 保存数据集。

    数据集代码生成到数据集项目属性中的选定项目,并且TableAdapter代码生成到当前项目中。

默认情况下,在分离数据集和 TableAdapter 代码后,结果是每个项目中的离散类文件。 原始项目包含一个名为DatasetName (或DatasetName.Designer.cs)的文件,该文件包含 TableAdapter 代码。 数据集项目属性中指定的项目包含一个名为DatasetName (或DatasetName.DataSet.Designer.cs)的文件,该文件包含数据集代码。

 备注

若要查看生成的类文件,请选择数据集或 TableAdapter 项目。 然后,在解决方案资源管理器中,选择 "显示所有文件"。

另请参阅

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章