数据适配器介绍
更新:2007 年 11 月
数据适配器是 ADO.NET 托管提供程序(一组用于数据源与数据集之间的通信的对象)的组成部分。(除适配器以外,托管提供程序还包括连接对象、数据读取器对象和命令对象。)适配器用于在数据源和数据集之间交换数据。在许多应用程序中,这意味着从数据库将数据读入数据集,然后从数据集将已更改数据写回数据库。然而,数据适配器可以在任意源和数据集之间移动数据。例如,可能会有在 Microsoft Exchange 服务器和数据集之间移动数据的适配器。
说明: |
---|
在 Visual Studio 的前一版本中,使用数据适配器在应用程序和数据库之间实现通信。尽管数据适配器仍是 .NET Framework 数据提供程序 (ADO.NET) 的一个主要组件,TableAdapter 是由设计器生成的组件,这些组件简化了在应用程序与数据库之间移动数据的过程。有关使用 TableAdapter 的更多信息,请参见 TableAdapter 概述。 |
通常,适配器是可配置的,允许您指定将哪些数据移入或移出数据集。这经常采取的形式是对 SQL 语句或存储过程的引用,这些语句或存储过程被调用时即可实现对数据库进行读写。
Visual Studio 使这些数据适配器可用于数据库:
OleDbDataAdapter 对象适用于由 OLE DB 提供程序公开的任何数据源。
SqlDataAdapter 对象特定于 SQL Server。由于该对象不必通过 OLE DB 层,所以它比 OleDbDataAdapter 快。但它只能用于 SQL Server 7.0 或更高版本。
OdbcDataAdapter 对象针对访问 ODBC 数据源进行了优化。
OracleDataAdapter 对象针对访问 Oracle 数据库进行了优化。
说明: 数据适配器、数据连接、数据命令和数据读取器是组成 .NET Framework 数据提供程序的组件。Microsoft 和第三方供应商可提供能集成到 Visual Studio 中的其他 .NET Framework 数据提供程序。有关其他 .NET Framework 数据提供程序的更多信息,请参见 .NET Framework 数据提供程序 (ADO.NET)。
可以创建和操控使用 .NET Framework 托管提供程序命名空间的以下部分的适配器。
SqlClient 托管提供程序命名空间
OleDb 托管提供程序命名空间
通常,每个数据适配器都在单个数据源表和数据集内的单个 DataTable 对象之间交换数据。如果数据集包含多个数据表,通常的策略是令多个数据适配器向数据集提供数据,并将其数据写回各个数据源表。
当要填充数据集内的某个表时,请调用执行某 SQL 语句或存储过程的适配器方法。适配器创建数据读取器对象 (SqlDataReader、OleDbDataReader、OdbcDataReader 或 OracleDataReader) 以将数据读入数据集。
说明: |
---|
可以从数据库读取数据而不必将其存储在数据集内,这在涉及只读数据的情况下非常高效。有关更多信息,请参见下面的“只读数据”。还可以直接执行 SQL 语句而不使用它们填充数据集。有关更多信息,请参见命令 (ADO.NET)。 |
类似地,当要更新数据库时,请调用某适配器方法,该方法调用适当的 SQL 语句或存储过程以在数据库中执行实际的更新。
数据适配器和相关表
在数据集内有单独表的含意是,数据适配器通常不引用联接表的 SQL 命令或存储过程。相反,相关表中的信息由各个适配器分别读到数据集内。因而 DataRelation 对象用于管理数据集表之间的约束(如级联更新),并允许您在相关主记录和子记录之间移动。
例如,设想您正在使用 Northwind 数据库中的两个相关表 Customers 和 Orders。通常将定义两个适配器,一个用于填充数据集内的 Customers 表,第二个用于将 Order 记录读入另一个数据集表,而不是指定联接将这两个表组合到单个结果集内。单个适配器可能包含选择判据以限制数据表中的记录个数。
在数据集内还可定义一个 DataRelation 对象,它指定通过 CustomerID 字段使订单记录与客户记录相关。您仍可以分别管理各个表,如果在从数据源获取记录前已有连接表,则不可能这样做。对于想要使用相关记录的情况,可以调用 DataRelation 对象的属性和方法。
有关数据关系的更多信息,请参见 数据集中的关系。
连接对象
数据适配器需要有与数据源的打开的连接才能读写数据。因此,适配器使用连接对象 (SqlConnection、OleDbConnection、OdbcConnection 或 OracleConnection) 与数据源通信。(适配器最多可以包含四个连接引用,分别用于它可执行的一种操作类型:选择、更新、插入和删除。)
下表列出“工具箱”的“数据”选项卡中的连接对象:
连接对象 |
说明 |
---|---|
到 SQL Server 7.0 或更高版本的数据库的连接。 |
|
到任何 OLE DB 数据源的连接。 |
|
到 ODBC 数据源的连接。 |
|
到 Oracle 数据库的连接。 |
在所有情况下,连接对象都代表数据源内的唯一会话。所有的连接对象都提供用于建立和修改连接详细信息(如用户 ID 和密码以及连接-超时设置)的属性。它们还提供一些用于开始、提交和回滚数据库事务的方法。有关连接对象的更多信息,请参见连接到数据源 (ADO.NET)。
安全说明: |
---|
存储敏感信息(如服务器名称、用户名和密码)可能会影响应用程序的安全性。若要控制对数据库的访问,一种较为安全的方法是使用 Windows 身份验证(也称为集成安全性)。 |
ADO.NET 命令对象
使用适配器,可以读取、添加、更新和删除数据源中的记录。为使您可以指定每种操作的进行方式,适配器支持以下四个属性:
SelectCommand – 引用某命令(SQL 语句或存储过程名称)从数据存储区检索行。
InsertCommand – 引用某命令以便向数据存储区插入行。
UpdateCommand – 引用某命令以便修改数据存储区中的行。
DeleteCommand – 引用某命令以便从数据存储区删除行。
属性是自身的对象,它们是 SqlCommand、OleDbCommand、OdbcCommand 或 OracleCommand 类的实例。这些对象支持包含对 SQL 语句或存储过程引用的 CommandText 属性。
说明: |
---|
命令类必须与连接类匹配。例如,如果正在使用 SqlConnection 对象与 SQL Server 通信,则还必须使用从 SqlCommand 类派生的命令。 |
尽管可以显式设置命令对象的文本,但不总需要这样做;在很多情况下,Visual Studio 将生成所需的 SQL 语句。此外,如果未指定 UpdateCommand、InsertCommand 或 DeleteCommand 对象,适配器可以在运行时自动生成适当的 SQL 语句。有关更多信息,请参见使用 CommandBuilder 生成命令 (ADO.NET)。
但是,可以在设计时和运行时操控命令对象,以便获得对命令执行方式的更直接控制。例如,可以恰在执行与 SelectCommand 对象关联的命令之前创建或修改该命令。
您还可以独立于数据适配器而自己执行命令。这使您可以通过数据适配器传递任意 SQL 命令,如那些用于定义或修改数据库定义的命令。还可以直接调用不返回记录集的存储过程(例如,对照数据库验证用户输入的存储过程)。有关更多信息,请参见执行命令 (ADO.NET)。
安全说明: |
---|
在使用将 CommandType 属性设置为 Text 的数据命令时,将从客户端发送的信息传递到数据库前请仔细检查该信息。有恶意的用户可能会试图发送(插入)修改过的或其他 SQL 语句,以期获得未经授权的访问或破坏数据库。在将用户输入内容传输到数据库之前,应始终确认这些信息是有效的;如果可能的话,请始终使用参数化查询或存储过程,这是最佳措施。有关更多信息,请参见脚本侵入概述。 |
命令参数
数据适配器中的命令通常是参数驱动的。例如,SelectCommand 属性的命令的 WHERE 子句中经常有一个参数,以便您可在运行时指定要从数据库获取哪些记录。其他命令使用一些参数,它们允许您在运行时传递要写入记录的数据以及要更新数据库中的哪个记录。有关如何在数据适配器中使用参数的更多信息,请参见数据适配器命令中的参数。
使用数据适配器读取和更新
数据适配器的主要用途是在数据源和数据集之间进行数据通信。适配器支持在二者之间移动数据的特定方法。
说明: |
---|
如果只想读取数据(而不更新数据),则不必将它存储在数据集内。相反,可以直接从数据库读出数据并读入应用程序。有关更多信息,请参见下面的“只读数据”。 |
可以使用数据适配器执行以下操作:
将行从数据存储区检索到数据集内相应的数据表中。
若要在数据集内检索行,请对数据适配器对象 (SqlDataAdapter、OleDbDataAdapter、OdbcDataAdapter 或 OracleDataAdapter) 使用 Fill 方法。当调用 Fill 方法时,它将向数据存储区传输一条 SQL SELECT 语句。
将对数据集表的更改传输到相应的数据存储区。
若要将数据集的数据集表传输到数据存储区,请使用适配器的 Update 方法。当调用该方法时,它将根据受影响的记录是新记录、已更改记录还是已删除记录来执行所需的 SQL INSERT、UPDATE 或 DELETE 语句。
有关如何使用数据适配器执行更新的更多信息,请参见使用 DataAdapter 更新数据源 (ADO.NET)。
只读数据
如果程序需要通过查询结果执行连续的只读传递,则可以使用数据读取器对象来代替填充数据集。数据读取器对象从数据源获取数据,并将这些数据直接传递给应用程序。通常,数据读取器对象用于当不需要在数据集内缓存数据时对数据进行只读、只能向前的访问。(数据适配器本身使用数据读取器对象来填充数据集。)显示数据库信息的 Web 窗体页便是一个例子;由于每次往返都要重新创建 Web 窗体页,因此在数据集内存储数据常常没有用。
Visual Studio 提供四个数据读取器对象:SqlDataReader、OleDbDataReader、OdbcDataReader 和 OracleDataReader。有关使用数据读取器对象进行高效只读访问的更多信息,请参见 DataAdapter (ADO.NET)。
表映射
默认情况下,当使用 Visual Studio 工具从数据库表生成数据集时,数据集内表和列的名称与数据库中的相同。但是,您可能会发现这并不实用。例如,您可能会发现数据库中使用的名称太简洁或太罗嗦了,或者名称使用的是外语。如果使用的是现有架构,则还可能发现架构中定义的名称与数据库中使用的名称不匹配。
因此,数据库中的名称和数据集内的名称不必匹配。相反,可以在数据集命令中创建新的表名和列名,然后将它们映射到数据库中所使用的名称。适配器使用 TableMappings 集合维持数据集结构(数据表和数据列)与数据存储区结构(表和列)之间的对应。有关表映射的更多信息,请参见 数据适配器中的表映射。