ADO.NET 数据访问介绍

使用 ADO.NET 开发应用程序时,将有操作数据的各种要求。在某些情况下,可能只是想在窗体上显示数据。在其他情况下,则可能需要设计一种方式来与另一个公司共享信息。

无论对数据进行怎样的操作,您都应理解有关 ADO.NET 中的数据方法的一些基本概念。您可能永远不必知道数据处理的某些细节(例如,您可能从来不必直接编辑包含数据的 XML 文件),但理解 ADO.NET 中的数据结构、主数据组件概念和组件组合方式是很有用的。

本介绍提供对这些最重要概念的高级别概述。本主题有意跳过了许多细节(例如,有关数据集的内容比这里提到的要多得多),以有利于仅向您介绍 ADO.NET 中的数据集成的概念。

注意   当部署包含 Visual Studio 数据访问组件的应用程序时,必须确保安装该应用程序的用户具有 Microsoft 数据访问组件 (MDAC) 的 2.7 版或更高版本。有关更多信息,请参见 tabindex="0" keywords="vxtskAddingLaunchConditionForMicrosoftDataAccessComponents">添加 Microsoft 数据访问组件的启动条件。

ADO.NET 不依赖于连续的活动连接

在传统的客户端/服务器应用程序中,组件将建立与数据库的连接,并在应用程序运行过程中使连接保持打开状态。出于各种原因,该方法在许多应用程序中是不实用的:

  • 打开的数据库连接占用宝贵的系统资源。在大多数情况下,数据库只可以维持少量的并发连接。维持这些连接的系统开销将降低应用程序的总体性能。
  • 类似地,需要打开的数据库连接的应用程序极难按比例扩展。对于没有很好地按比例扩展的应用程序而言,也许四个用户使用它时执行效果是可以接受的,但如果有数百个用户使用它时其效果也许就不能被接受了。ASP.NET Web 应用程序尤其需要能够很轻松地进行扩展,因为 Web 站点的通信量可能会在非常短的时间内突增几个数量级。
  • 在 ASP.NET Web 应用程序中,组件彼此之间本来就是不连接的。浏览器从服务器请求一页;在服务器完成处理并发送该页后,服务器即不再与浏览器有任何连接,直到下一次请求为止。在这些情况下,维持打开的数据库连接是不可行的,因为没有办法知道数据使用者(客户端)是否需要进一步的数据访问。
  • 基于始终连接数据的模型可能使得使用连接结构在应用程序和组织边界之间交换数据变得困难且不实际。如果两个组件需要共享相同的数据,则二者均必须连接,或者必须为这两个组件设计一种方式以相互传递数据。

出于所有这些原因,使用 ADO.NET 进行数据访问是以有节制使用连接的结构为中心进行设计的。应用程序连接到数据库的时间仅足够获取或更新数据。因为数据库并未被大部分时间空闲的连接占用,所以它可以为更多用户提供服务。

使用数据命令执行数据库交互

若要在数据库中执行操作,应执行 SQL 语句或存储过程(它包括 SQL 语句)。您使用 SQL 语句或存储过程读写行并执行聚合函数,例如添加或求平均值。您还使用 SQL 语句或存储过程创建或修改表或列、执行事务等。

在 ADO.NET 中,您使用数据命令打包 SQL 语句或存储过程。例如,如果您想要从数据库读取一组行,则创建一个数据命令并用 SQL Select 语句的文本或获取记录的存储过程的名称配置它。

如果您想要获取这些行,请执行以下操作:

  1. 打开一个连接。
  2. 按以下顺序调用命令的执行方法:
    1. 执行该命令引用的 SQL 语句或存储过程。
    2. 然后关闭连接。

      连接保持打开的时间仅足够执行语句或存储过程。

在调用命令的执行方法后,它将返回一个值。更新数据库的命令返回所影响的行数;其他类型的命令返回一个错误代码。如果该命令使用 SELECT 语句查询数据库,则它返回一组行。您可以使用数据阅读器(作为非常快的只读、只进游标)获取这些行。有关更多信息,请参见 tabindex="0" keywords="cpconTheADONETDataReader">使用 DataReader 检索数据。

安全说明   当使用 tabindex="0" keywords="frlrfSystemDataSqlClientSqlCommandClassCommandTypeTopic">CommandType 属性设置为 Text 的数据命令时,请对从客户端发送过来的信息进行仔细检查,然后再将它传递给数据库。恶意用户可能会试图发送(插入)修改过的或其他 SQL 语句,以获得未经授权的访问或破坏数据库。在将用户输入内容传输到数据库之前,应始终确认这些信息是有效的;如果可能的话,请始终使用参数化查询或存储过程,这是最佳措施。有关更多信息,请参见 脚本利用。

如果您需要执行多个操作(例如,读取一些行,然后更新它们),则可以使用多个数据命令,每个操作一个命令。每一操作分别执行。例如,要读取多行,您应打开连接,读取这些行,然后关闭该连接。如果您需要更新数据,再次打开连接,执行更新,然后再次关闭该连接。

数据命令可以包括多个参数(具体而言,参数对象的集合),您可以使用这些参数创建类似以下形式的参数化查询:

Select * From customers Where (customer_id = @customerid)

然后您可以在运行时设置这些参数并执行命令以返回或更新所需数据。

数据可被缓存到数据集中

最常见数据任务是从数据库检索数据并对数据进行某些操作:显示数据、处理数据或将数据发送给另一个组件。经常地,应用程序需要处理不止一条记录,而是一组记录:例如客户列表或今天的订单。通常应用程序所需的该组记录来自多个表:我的客户及其所有订单;所有名为“Smith”的作者及他们写的书;以及其他类似的相关记录组。

获取了这些记录后,应用程序通常将它们成组使用。例如,应用程序可以允许用户浏览名为“Smith”的所有作者,检查一个 Smith 的书,然后检查下一个 Smith 的书,等等。

在许多情况下,每次应用程序需要处理下一条记录时都返回到数据库是不切实际的。(这样做可能会失去将打开连接的需求降至最低所带来的许多好处。)因此解决方案就是临时存储从数据库检索的记录,然后使用该临时集。

这便是数据集的概念。数据集是从数据源检索的记录的缓存。它的工作方式如同虚拟的数据存储区:数据集包含一个或多个表(这些表基于实际数据库中的表),并且它可以包含有关这些表之间的关系和对表可包含数据的约束的信息。

数据集内的数据通常是数据库中内容的非常精简的版本。但是,可以用与操作实际数据十分类似的方式操作数据集。这样操作时,您将保持与数据库的不连接状态,使数据库可以自由执行其他任务。

当然,您经常需要更新数据库中的数据(尽管不会像从数据库检索数据那么频繁)。可以在数据集上执行更新操作,并且这些更新可以直接写到基础数据库。

数据集是数据的被动容器这一点很重要。若要实际从数据库获取数据和(可选)将数据写回数据库,请使用数据适配器。数据适配器包含一个或多个数据命令,这些命令用于填充数据集中的单个表并更新数据库中的相应表。(数据适配器通常包含四条命令,分别用于选择、插入、更新和删除数据库中的行。)因此,每当调用数据适配器的 Fill 方法时,它都可能执行 SELECT au_id, au_lname, au_fname FROM authors 之类的 SQL 语句。

因为数据集实际上是数据库数据的私有副本,所以它不一定反映数据库的当前状态。如果想要查看其他用户进行的最新更改,可以通过调用适当的 Fill 方法刷新数据集。

使用数据集的一个便利之处是组件可以根据需要交换数据集。例如,中层的某个业务对象可以创建和填充一个数据集,然后将它发送给应用程序中其他位置处的另一个组件以供处理。该功能意味着组件不必分别查询数据库。

数据集独立于数据源

尽管数据集是作为从数据库获取的数据的缓存,但数据集与数据库之间没有任何实际关系。数据集是容器;它由从数据适配器执行的 SQL 命令或存储过程填充。

由于数据集不直接绑定到数据源,所以它是来自多个源的数据的好的集成点。例如,数据集内的某些数据可能来自数据库,而它的其他部分可能来自另一个数据库或电子表格之类的非数据库源。数据集内的某些数据可能来自另一个组件所发送的流。一旦数据在数据集内,则不管它的原始源是什么,都可以使用一致的对象模型对它进行操作。

数据保持为 XML

数据需要从数据存储区移动到数据集以及从数据集移动到各种组件。在 ADO.NET 中,传输数据的格式是 XML。类似地,如果需要保持数据(例如保持到文件中),则将其存储为 XML。如果有 XML 文件,则可以像使用任何数据源一样使用它,并从它创建数据集。

实际上,在 ADO.NET 中,XML 是数据的基本格式。ADO.NET 数据 API 自动用数据集内的信息创建 XML 文件或流,并将它们发送给另一个组件。第二个组件可以调用类似的 API 将 XML 读回数据集。(数据不以 XML 格式存储在数据集内(例如,不能使用 XML 分析器分析数据集内的数据),而是以更有效的格式存储。)

使数据协议以 XML 为基础可提供许多便利之处:

  • XML 是工业标准格式。这意味着您的应用程序数据组件可以与其他任何应用程序中的其他任何组件交换数据,只要该组件理解 XML。许多应用程序被编写为可理解 XML,为异类应用程序间交换提供了空前高的水平。
  • XML 是基于文本的。数据的 XML 表示形式不使用任何二进制信息,这使它可以通过任何协议(如 HTTP)发送。大多数防火墙将阻塞二进制信息,但通过将信息格式化为 XML,组件仍可以方便地交换信息。

对于大多数方案,您不必知道 XML 便可以使用 ADO.NET 中的数据。ADO.NET 自动根据需要将数据转换为 XML 或从 XML 转换出数据;您使用普通编程方法与数据进行交互。

架构定义数据结构

尽管您不必知道有关 XML 的任何事情便可以读写数据库和使用数据集,但也有一些情况下使用 XML 恰是您追寻的目标。如不打算访问数据而要进行数据设计时的情况。换句话说,在 ADO.NET 中当您使用元数据时,将直接使用 XML。

数据集以 XML 表示。数据集的结构(定义数据集中有哪些表、列、数据类型、约束等)是使用基于 XML 架构定义语言 (XSD) 的 XML 架构定义的。就像数据集包含的数据可以从 XML 加载和序列化为 XML 一样,数据集的结构也可以从 XML 架构加载和序列化为 XML 架构。

对于您对 ADO.NET 中的数据进行的大部分操作,您不必深入钻研架构。通常,Visual Studio .NET 工具将基于您在可视化设计器中执行的操作,根据需要生成和更新架构。例如,当使用这些工具创建表示数据库中的表的数据集时,Visual Studio .NET 将生成描述数据集结构的 XML 架构。然后该 XML 架构用于生成类型化数据集,在该数据集内数据元素(表、列等等)可作为头等成员使用。有关类型化数据集的更多信息,请参见数据集介绍。

但是,有时您会希望自己创建或编辑架构。典型的示例是与合作伙伴或客户一起开发架构。在此情况下,架构将作为您和合作伙伴之间有关将交换的、基于 XML 的数据形状的合同。在此情况下,您必须经常将架构元素映射到自己的数据集结构。有关设计架构的更多信息,请参见 XML 架构和数据。

ADO.NET 的组件

以下插图显示 ADO.NET 应用程序的主组件。

ADO.NET 数据组件

下表汇总上面所示的 ADO.NET 数据组件,并提供指向更多信息的链接。

你可能感兴趣的:(ADO.NET)