若要在数据存储区和应用程序之间移动数据,必须首先拥有到该数据存储区的连接。在 ADO.NET 中,可以使用以下两个连接对象之一创建和管理连接:

通过忽略 OLE DB 层(包括其他措施),对 SqlConnection 对象进行优化以便将其用于 SQL Server 7.0 或更高版本。OleDbConnection 对象与 OLE DB 交互,为各种数据源(从简单文本文件到电子表格到(毫无疑问)功能齐全的数据库)公开一致的 API。

注意 Connection 对象是 .NET 数据提供程序的一个组件。.NET 框架中的数据提供程序用作应用程序和数据源之间的桥梁,并且用于从数据源检索数据以及协调对返回到数据源的数据的更改。ConnectionCommandDataReaderDataAdapter 对象表示 .NET 数据提供程序模型的核心元素。有关更多信息,请参阅 使用 .NET 数据提供程序访问数据

连接字符串

两种连接对象大致公开相同的成员。然而,对于给定 OleDbConnection 对象可用的特定成员取决于它所连接到的数据源;并非所有数据源都支持 OleDbConnection 类的全部成员。

与连接对象关联的主要属性是 ConnectionString 属性,它由带有属性/值对的字符串(用于提供登录数据库和指向特定数据库所需的信息)组成。典型的 ConnectionString 属性可能如下所示:

Provider=SQLOLEDB.1;Data Source=MySQLServer;Initial Catalog=NORTHWIND;Integrated Security=SSPI

此特定连接字符串指定连接应使用 Windows 集成安全性(NT 身份验证)。连接字符串可以改为包括用户 ID 和密码,但通常不建议这样做,因为这些属性之后被编译到您的应用程序中,因而可能对安全性造成潜在危害。有关更多信息,请参阅 安全模型

OLE DB 使用的最常见属性/值对也分别由单个属性表示,如 DataSourceDatabase(也可以是 UserIdPassword)。当使用连接对象时,可以将 ConnectionString 属性设置为单个字符串,也可以设置单个连接属性。(如果数据源需要未由单个属性表示的连接字符串值,则必须设置 ConnectionString 属性。)或者,还可以将 ConnectionString 属性设置为 Microsoft 数据链接 (.udl) 文件的路径。有关数据链接文件的更多信息,请参阅 数据链接 API 概述

注意 SQLConnection 对象不支持(或不允许指定)Provider 属性。

打开和关闭连接

连接的两个主要方法是 OpenCloseOpen 方法使用 ConnectionString 属性中的信息联系数据源并建立一个打开的连接。Close 方法关闭连接。关闭连接是必要的,因为大多数数据源只支持有限数目的打开的连接,并且打开的连接占用宝贵的系统资源。

如果正在使用数据适配器或数据命令,则不必显式打开和关闭连接。当调用这些对象的某个方法(例如数据适配器的 FillUpdate 方法)时,该方法将检查连接是否已打开。如果没有,适配器将打开连接,执行其逻辑,然后再关闭连接。

Fill 之类的方法仅当连接尚未打开时才自动打开和关闭连接。如果连接是打开的,则这些方法使用连接但并不关闭它。这使您可以自行灵活地打开和关闭数据命令。当有共享一个连接的多个数据适配器时可能会这样做。在此情况下,让每个适配器在调用其 Fill 方法时均打开和关闭连接将是低效的。相反,可以打开连接,调用每个适配器的 Fill 方法,然后在完成后关闭连接。

池连接

应用程序经常有多个用户执行相同类型的数据库访问。例如,在 ASP.NET Web 应用程序中可能有许多用户正在查询相同的数据库以获取相同数据。在这些情况下,可以通过使应用程序共享到数据源的连接来提高应用程序的性能。否则,让每个用户打开和关闭单独的连接的开销会对应用程序性能产生不利影响。

如果使用的是 OleDbConnection 类,则连接池将由提供程序自动处理,您不必自己进行管理。如果使用的是 SqlConnection 类,则连接池被隐式管理,但也提供选项允许您自己管理池。有关更多信息,请参阅 SQL Server .NET 数据提供程序的连接池管理

事务

连接对象通过 BeginTransaction 方法支持事务,该方法创建事务对象( OleDbTransaction SqlTransaction 对象)。事务对象反过来支持使您可以提交或回滚事务的方法。

事务以代码进行管理。有关更多信息,请参阅 执行事务

可配置的连接属性

在许多应用程序中,连接信息无法在设计时确定。例如,在将分发给许多不同客户的应用程序中,在设计时可能无法确定连接信息(如服务器名、用户名或密码)。

因此,连接字符串经常被指定为动态属性。由于动态属性存储在配置文件中(且不编译到应用程序二进制文件中),因此它们可以更改而不必重新编译应用程序。

典型的策略是将连接属性指定为动态属性,为用户提供一种方式(如 Windows 窗体或 Web 窗体页)来指定相关详细信息,然后更新配置文件。.NET 框架中内置的动态属性机制会在读取属性时自动从配置文件获取相应值,并在更新值时更新配置文件。

将连接字符串详细信息(如服务器名、用户名和密码)存储为动态属性可以暗含应用程序安全性设置。有关更多信息,请参阅下面的“连接信息和安全性”。有关动态属性的更多信息,请参阅 使用动态属性配置应用程序

连接信息和安全性

由于打开连接涉及获得对重要资源(数据库)的访问,因此配置和使用连接经常存在安全性问题。

如何保护应用程序及其对数据源访问的安全取决于系统的结构。例如,在基于 Web 的应用程序中,用户通常获得对 Internet 信息服务 的匿名访问,因此不提供安全身份验证凭据。在此情况下,应用程序将维护自己的登录信息并使用它(而不是任何特定用户信息)来打开连接和访问数据库。用户名和密码可以直接作为在设计时设置的属性编译到应用程序中,也可以指定为在 ASP.NET Web 应用程序的配置文件中设置的动态属性。

通过内在的 ASP.NET 安全模型来保护 ASP.NET Web 应用程序二进制文件和配置文件不会被通过 Web 访问,该模型防止使用任意 Internet 协议(HTTP、FTP 等)对这些文件的访问。若要防止通过其他方法(例如从内部网络中)对 Web 服务器计算机本身的访问,请使用 Windows 的安全功能。

在 Intranet 或双层应用程序中,可以利用 Windows、IIS 和 SQL Server 提供的集成安全性选项。在这个模型中,用户在本地网络的身份验证凭据也用于访问数据库资源,并且在连接字符串中不使用任何显式用户名或密码。(通常,通过组在数据库服务器计算机上建立权限,因此您不必为可能访问数据库的每个用户建立单个的权限。)在该模型中,您根本不必存储连接的登录信息,并且不需要任何额外步骤来保护连接字符串信息。

有关安全性的更多信息,请参阅以下主题:

“服务器资源管理器”中的设计时连接

“服务器资源管理器”为您提供一种创建到数据源的设计时连接的方式。它允许您浏览可用的数据源,显示有关它们包含的表、列及其他元素的信息,以及编辑和创建数据库元素。

应用程序不直接使用您以该方式创建的连接。通常,设计时连接提供的信息用于设置添加到应用程序的新连接对象的属性。

例如,在设计时可以使用“服务器资源管理器”创建到 SQL 服务器 MyServer 和数据库 Northwind 的连接。稍后在设计窗体时,可以浏览 Northwind 数据库,从表中选择列,并将它们拖动到窗体上。这将为您的窗体创建一个数据适配器。它还创建一个新的窗体特定的连接,从设计时连接将连接字符串信息复制到新的连接。当运行应用程序时,新的连接将用于访问数据源。

有关设计时连接的信息独立于特定的项目或解决方案存储在本地计算机上。因此,在应用程序中工作时建立了设计时连接以后,每当您在 Visual Studio 中工作时它都将出现在“服务器资源管理器”中(只要该连接指向的服务器可用)。有关使用“服务器资源管理器”和创建设计时连接的更多信息,请参阅 在服务器资源管理器中添加新的数据连接

Visual Studio 中的连接设计工具

通常不必在 Visual Studio 中直接创建和管理连接对象。当使用“数据适配器配置向导”之类的工具时,这些工具通常提示您输入连接信息(即连接字符串信息),并自动为您在正在操作的窗体或组件上创建连接对象。

但是,如果希望,您可以自行向窗体或组件添加连接对象并设置其属性。这在未使用数据集(因此未使用数据适配器)而只是读取数据时很有用。如果您打算使用事务,则可以自行创建连接对象。