数据适配器是 ADO.NET 托管提供程序(用于在数据源和数据集之间通讯的一组对象)的组成部分。(除适配器以外,托管提供程序还包括连接对象、数据阅读器对象和命令对象。)适配器用于在数据源和数据集之间交换数据。在许多应用程序中,这意味着从数据库将数据读入数据集,然后从数据集将已更改数据写回数据库。然而,数据适配器可以在任意源和数据集之间移动数据。例如,可能会有在 Microsoft Exchange 服务器和数据集之间移动数据的适配器。

注意 有关数据提供程序的更多信息,请参阅 使用 .NET 数据提供程序访问数据

通常,适配器是可配置的,允许您指定将哪些数据移入或移出数据集。这经常采取的形式是对 SQL 语句或存储过程的引用,这些语句或存储过程被调用时即可实现对数据库进行读写。

Visual Studio 提供两种主要的数据适配器以供与数据库一起使用:

可以创建和操控使用 .NET 框架托管提供程序命名空间的以下部分的适配器。

OleDb 托管提供程序命名空间

SqlClient 托管提供程序命名空间

通常,每个数据适配器都将在单个数据源表和数据集内的单个 DataTable 对象之间交换数据。如果数据集包含多个数据表,通常的策略是令多个数据适配器向数据集提供数据,并将其数据写回各个数据源表。

当要填充数据集内的某个表时,请调用执行某 SQL 语句或存储过程的适配器方法。该适配器将创建一个数据阅读器对象( OleDbDataReader SqlDataReader )以将数据读入数据集。

注意 可以从数据库读取数据而不必将其存储在数据集内,这在涉及只读数据的情况下十分有效。有关详细信息,请参阅下面的“只读数据”。还可以直接执行 SQL 语句而不使用它们填充数据集。

类似地,当要更新数据库时,请调用某适配器方法,该方法调用适当的 SQL 语句或存储过程以在数据库中执行实际的更新。

数据适配器和相关表

在数据集内有单独表的含意是,数据适配器通常不引用联接表的 SQL 命令或存储过程。相反,相关表中的信息由各个适配器分别读到数据集内。然后使用 DataRelation 对象管理数据集表之间的约束(如级联更新),并允许您在相关主记录和子记录之间移动。

例如,设想您正在使用 Northwind 数据库中的两个相关表 Customers 和 Orders。通常将定义两个适配器,一个用于填充数据集内的 Customers 表,第二个用于将 Order 记录读入另一个数据集表,而不是指定联接将这两个表组合到单个结果集内。单个适配器可能包含选择判据以限制数据表中的记录个数。

在数据集内还可定义一个 DataRelation 对象,它指定通过 CustomerID 字段使订单记录与客户记录相关。您仍可以分别管理各个表,如果在从数据源获取记录前已有连接表,则不可能这样做。对于想要使用相关记录的情况,可以调用 DataRelation 对象的属性和方法。

连接对象

数据适配器需要有与数据源的打开的连接才能读写数据。因此,适配器使用 OleDbConnectionSqlConnection 对象与数据源通讯。(适配器最多可以包含四个连接引用,分别用于它可执行的一种操作类型:选择、更新、插入和删除。)OleDbConnection 对象是到任意 OLE DB 数据源的连接。SqlConnection 是到 SQL Server 7.0 或更高版本数据库的连接。在两种情况下,连接对象都代表数据源内的唯一会话。OleDbConnectionSqlConnection 对象都提供一些属性来建立和修改连接属性(如用户 ID 和密码、隔离级别以及连接超时设置)。它们还提供一些方法来开始、提交和回滚数据库事务。

ADO.NET 命令对象

使用适配器,可以读取、添加、更新和删除数据源中的记录。为使您可以指定每种操作的进行方式,适配器支持以下四个属性:

属性本身也是对象——它们是 OleDbCommand 类或 SqlCommand 类的实例。这些对象支持包含对 SQL 语句或存储过程引用的 CommandText 属性。

注意 命令类必须与连接类匹配。例如,如果正在使用 SqlConnection 对象与 SQL Server 通讯,则还必须使用从 SqlCommand 类派生的命令。

尽管可以显式设置 OleDbCommandSqlCommand 的文本,但不总需要这样做;在很多情况下,Visual Studio 将生成所需的 SQL 语句。此外,如果未指定 UpdateCommandInsertCommandDeleteCommand 对象,适配器可以在运行时自动生成适当的 SQL 语句。有关详细信息,请参阅 自动生成的命令

但是,可以在设计时和运行时操控命令对象,以便获得对命令执行方式的更直接控制。例如,可以恰在执行与 SelectCommand 对象关联的命令之前创建或修改该命令。

您还可以独立于数据适配器而自己执行命令。这使您可以通过数据适配器传递任意 SQL 命令,如那些用于定义或修改数据库定义的命令。还可以直接调用不返回记录集的存储过程(例如,验证数据库中用户输入的存储过程)。有关详细信息,请参阅 执行命令

命令参数

数据适配器中的命令通常是参数驱动的。例如,SelectCommand 属性的命令的 WHERE 子句中经常有一个参数,以便您可在运行时指定要从数据库获取哪些记录。其他命令使用一些参数,它们允许您在运行时传递要写入记录的数据以及要更新数据库中的哪个记录。

使用数据适配器读取和更新

数据适配器的主要用途是在数据源和数据集之间进行数据通讯。适配器支持在二者之间移动数据的特定方法。

注意 如果只想读取数据(而不更新数据),则不必将它存储在数据集内。相反,可以直接从数据库读出数据并读入应用程序。有关详细信息,请参阅下面的“只读数据”。

可以使用数据适配器执行以下操作:

只读数据

如果程序需要通过查询结果执行连续的只读传递,则可以使用数据阅读器对象来代替填充数据集。数据阅读器对象从数据源获取数据,并将这些数据直接传递给应用程序。通常,数据阅读器对象用于当不需要在数据集内缓存数据时对数据进行只读、只能向前的访问。(数据适配器本身使用数据阅读器对象来填充数据集。)显示数据库信息的 Web 窗体页便是一个例子;由于每次往返都要重新创建 Web 窗体页,因此在数据集内存储数据常常没有用。

Visual Studio 提供两个数据阅读器对象:OleDbDataReader 对象和 SqlDataReader 对象,分别用于 OLE-DB 源和 SQL Server 7.0。

表映射

默认情况下,当使用 Visual Studio 工具从数据库表生成数据集时,数据集内表和列的名称与数据库中的相同。但是,您可能会发现这并不实用。例如,您可能会发现数据库中使用的名称太简洁或太罗嗦了,或者名称使用的是外语。如果使用的是现有架构,则还可能发现架构中定义的名称与数据库中使用的名称不匹配。

因此,数据库中的名称和数据集内的名称不必匹配。相反,可以在数据集命令中创建新的表名和列名,然后将它们映射到数据库中所使用的名称。适配器使用 TableMappings 集合维持数据集结构(数据表和数据列)与数据存储区结构(表和列)之间的对应。