ADO.NET






3.20/5 (4投票s)
理解 ADO.NET
介绍
本文旨在为初学者提供一个参考,以帮助他们理解 ADO.NET。
了解 ADO.NET
使用 Windows Forms 理解 DataSet 和表关系
有时,.NET Framework 的学习者可能会发现,直接使用请求相应的 SQL 命令来访问数据库比较困难。某些人可能没有像 T-SQL 这样的语言经验来查询数据库,因此会转而学习 ADO.NET。ADO.NET 实际上由 FCL 中 `System.Data` 命名空间中包含的类组成。基于原始的 ADO(ActiveX Data Objects),ADO.NET 在其他方面添加了 `DataSet`。`DataSet` 是所有相关数据库对象的集合:表、列、关系、约束、存储过程等。这些概念将很快解释。本文将重点构建一个 C# Windows Forms 应用程序,该应用程序位于硬盘上实际永久数据库之上,以避免用户直接访问数据库。构建访问数据库的应用程序的逻辑是为了简化数据库访问过程,避免可能的数据库访问限制和复杂查询。当然,这假设我们正在处理一个与数据库访问代码位于同一台机器上的单一应用程序。该实用程序将是一个 Windows Forms 应用程序,通过 `System.Data.OleDb` .NET 数据提供程序访问 Microsoft Access 数据库文件。实际上,有四个托管 .NET 数据提供程序
System.Data.SqlClient
System.Data.Oledb
System.Data.Odbc
System.Data.Oracle
这四个 .NET 托管提供程序提供五个主要对象
Connections
:用于连接数据库并管理针对数据库的事务。Commands
:用于向数据库发出 SQL 命令。DataReaders
:用于从 SQL Server 数据源读取仅向前的数据记录流。DataSets
:用于存储、远程处理和编程针对平面数据、XML 数据和关系数据。DataAdapters
:用于将数据推送到 `DataSet` 中,并协调数据库中的数据。
Windows Form 将加载并访问数据,而不是直接访问数据库。我们首先构建一个简单的 C# Windows Forms 应用程序,并将其命名为“`UserData`”。
构建表单后,我们现在想选择工具栏上的“数据”选项,点击“添加新数据源”。这将调用数据源配置向导。

然后我们点击下一步选择数据存储(数据库),这是一个 Microsoft Access 数据库文件。请注意,.NET Framework 的托管数据提供程序是 `System.Data.OleDb`。这是因为我们没有选择使用 SQL Server 或任何 SQL 数据库文件。我们选择 Access 文件是为了保持简单。

典型的 Microsoft Office 文件,如 Word、Excel 或 Access,基于 ActiveX 技术,而 ActiveX 技术又基于组件对象模型。COM 是一组编程标准,基于约九种技术,这些技术构成了 OLE 2,即对象嵌入和链接 2.0。.NET Framework 数据提供程序因此适用于 OLE DB。点击“确定”后,我们会看到一个对话框,要求我们浏览该 Access 文件。此文件包含在可下载的 zip 文件中,内容应解压到您存放项目文件的工作目录中。测试数据库文件连接成功后,我们保存连接字符串。

测试连接成功后,我们保存连接字符串。

此时,我们应该停下来并记录我们所采取的步骤。我们首先构建了一个 Windows 窗体。任何熟悉 Windows 窗体甚至 Web 窗体的人都知道工具箱有一组丰富的控件,可以拖放到窗体表面上以设置其属性。在此应用程序中,我们将数据绑定到用户界面控件。然后,我们选择定位一个新数据源,一个 Microsoft Access 文件。接下来,我们构建了一个连接字符串以连接到数据库。但我们的目标是构建一个访问数据库的应用程序。这意味着 UI 必须具有作为数据访问组件的控件,因为我们希望将数据绑定到 UI 控件。数据绑定是用户界面控件的一项功能,允许它们从数据源(例如数据库)检索数据。这使我们了解了 AD0.NET 最重要的功能之一:数据访问组件。请注意点击“下一步”后显示的对话框。

请记住,我们的 Windows Form 应用程序旨在访问数据库,为了实现这一目标,我们的目标是将数据 `DataBind` 到用户界面控件上。这种数据绑定意味着由 `DataBindingSource` 引用的数据并将其绑定到控件。换句话说,控件将从您的数据访问组件接收数据,数据将自动显示在控件中供用户查看和操作。
请注意,我们选择了两个表,`Departments` 和 `Instructors`。这些选定的数据库对象将构成 `DataSet`。`DataSet` 与硬盘上的永久数据库的区别在于,`DataSet` 是数据库的缓存或内存中的视图。当我们需要更改数据库时,我们对数据库的内存副本进行更改。也就是说,如果我们删除、修改、更新或添加一条记录(行),这些更改将复制到永久数据库。但是,表格数据如何以表格形式临时存储在内存中呢?除了将数据存储在表中之外,`DataSet` 组件类似于一个小型引擎,可以存储内存中的数据并富含元数据。这包括表名和列名、数据类型以及撤消数据更改所需的信息。所有数据都以 XML 形式表示在内存中。`DataSet` 可以保存到 XML 文件,然后重新加载到内存中。它可以以 XML 格式通过网络(包括 Internet)传递。
重申一下,ADO.NET 管理数据库的连接,在本例中是一个 Microsoft Access 文件。建立与数据源的连接涉及通过文件系统或网络协议定位该数据库的过程。DataSet 被认为是一个断开连接的记录集,因为它不知道数据存储。由于我们正在构建一个具有用户界面的应用程序,因此可以在应用程序运行时保持与 DataSet 的连接打开。也就是说,一旦建立连接,Windows Forms 应用程序就可以开始与数据库通信。作为 .NET Framework 托管平台的一部分,ADO.NET 管理对数据的请求和来自数据源的响应。`DataAdapter` 对象连接到数据库并填充 `DataSet` 对象。然后它重新连接到数据库,根据在 `DataSet` 持有数据时执行的操作更新数据库。虽然 `DataSet` 不知道数据源,但托管提供程序拥有详细而具体的信息。它的作用是连接、填充和将 `DataSet` 从数据库持久化到数据库。持久化意味着保持对象的状态持久,因为它们经常被访问。持久化通过对象序列化实现。
当我们点击完成时,我们看到 *Students.mdb* 是永久数据库文件。如果我们双击 XML 模式文件,我们会得到文件的设计器视图,并且还会看到数据库浏览器中的对象与 XSD 文件之间的一一对应关系。

请注意,XSD 文件具有 `TableAdapter` 组件。这就是前面提到的 `DataAdapter` 组件。`TableAdapter` 包含用于从数据源选择数据的查询以及用于连接数据库的连接信息。作为 `DataAdapter` 对象,它在提供一个桥梁以在其 `DataSet` 和其源数据存储之间检索和保存数据的方法中处于中心地位。通常,它通过向数据库发出适当的 SQL 命令请求来完成此操作。请注意紧跟在 `TableAdapter` 下面命名的方法。
`BindingSource` 组件充当 `DataSet` 和数据绑定控件之间的桥梁。`BindingNavigator` 提供了一个标准 UI 组件,允许您浏览数据源中的行。此数据访问组件绑定到 `BindingSource` 组件,就像 `DataGridView` 组件一样。应单击数据库资源管理器视图中 `Instructor` 和 `Department` 组件上的箭头,以获取 `DataGrid` 视图选项。为它们两者选择该选项后,您可以将它们拖放到表单上:两个表都将绑定到 UI,因为它们之间存在关系。如何实现?通过从工具栏上的“数据”选项中选择“添加关系”。关系对话框如下所示。
