ADO.NET 概述

    ADO.NET 对 Microsoft SQL Server 和 XML 等数据源以及通过 OLE DB 和 XML 公开的数据源提供一致的访问。数据共享使用者应用程序可以使用 ADO.NET 来连接到这些数据源,并检索处理更新所包含的数据。

    ADO.NET 通过数据处理将数据访问分解为多个可以单独使用或一前一后使用的不连续组件。ADO.NET 包含用于连接到数据库、执行命令和检索结果的 .NET Framework 数据提供程序。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。ADO.NET DataSet 对象也可以独立于 .NET Framework 数据提供程序使用,以管理应用程序本地的数据或源自 XML 的数据。

    ADO.NET 类在 System.Data.dll 中,并且与 System.Xml.dll 中的 XML 类集成。当编译使用 System.Data 命名空间的代码时,请引用 System.Data.dll 和 System.Xml.dll。

    ADO.NET 向编写托管代码的开发人员提供了类似于 ActiveX 数据对象 (ADO) 为本机组件对象模块 (COM) 开发人员提供的功能。

 

可以使用 ADO.NET 的两个组件来访问和处理数据:

  • .NET Framework 数据提供程序

  • DataSet


    .NET Framework 数据提供程序

    .NET Framework 数据提供程序是专门为数据处理以及快速地只进、只读访问数据而设计的组件。Connection 对象提供与数据源的连接。Command 对象使您能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。DataReader 从数据源中提供高性能的数据流。最后,DataAdapter 提供连接 DataSet 对象和数据源的桥梁。DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到 DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。

    DataSet

    ADO.NET DataSet 专门为独立于任何数据源的数据访问而设计。因此,它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 包含一个或多个 DataTable 对象的集合,这些对象由数据行和数据列以及有关 DataTable 对象中数据的主键、外键、约束和关系信息组成。


    下图说明 .NET Framework 数据提供程序与 DataSet 之间的关系。

    ADO.NET 结构


    图片:数据提供程序

    选择 DataReader 或 DataSet

    在决定应用程序应使用 DataReader(请参见使用 DataReader 检索数据)还是应使用 DataSet(请参见在 ADO.NET 中使用 DataSet)时,应考虑应用程序所需的功能类型。DataSet 用于执行以下功能:

    • 在应用程序中将数据缓存在本地,以便可以对数据进行处理。如果只需要读取查询结果,DataReader 是更好的选择。

    • 在层间或从 XML Web 服务对数据进行远程处理。

    • 与数据进行动态交互,例如绑定到 Windows 窗体控件或组合并关联来自多个源的数据。

    • 对数据执行大量的处理,而不需要与数据源保持打开的连接,从而将该连接释放给其他客户端使用。

    如果不需要 DataSet 所提供的功能,则可以使用 DataReader 以只进、只读方式返回数据,从而提高应用程序的性能。虽然 DataAdapter 使用 DataReader 来填充 DataSet 的内容(请参见从 DataAdapter 填充 DataSet),但可以使用 DataReader 来提高性能,因为这样可以节省 DataSet 所使用的内存,并将省去创建 DataSet 并填充其内容所需的处理。

    XML 和 ADO.NET

    ADO.NET 利用 XML 的力量来提供对数据的断开式访问。ADO.NET 的设计与 .NET Framework 中 XML 类的设计是并进的,它们都是同一个结构的组件。

    ADO.NET 和 .NET Framework 中的 XML 类集中于 DataSet 对象。无论 XML 源是文件还是 XML 流,都可以用来填充 DataSet。无论 DataSet 中数据的数据源是什么,DataSet 都可以作为符合万维网联合会 (W3C) 标准的 XML 进行编写,并且将其架构包含为 XML 架构定义语言 (XSD) 架构。由于 DataSet 固有的序列化格式为 XML,因此是在层间移动数据出色的媒介,这使 DataSet 成为在远程向 XML Web 服务发送数据和架构上下文以及从 XML Web 服务接收数据和架构上下文的最佳选择。


    .NET Framework 数据提供程序

    .NET Framework 数据提供程序用于连接到数据库、执行命令和检索结果。您可以直接处理检索到的结果,或将其放入 ADO.NET DataSet 对象,以便与来自多个源的数据或在层之间进行远程处理的数据组合在一起,以特殊方式向用户公开。.NET Framework 数据提供程序是轻量的,它在数据源和代码之间创建了一个最小层,以便在不以功能为代价的前提下提高性能。

    下表列出了 .NET Framework 中包含的 .NET Framework 数据提供程序。

    .NET Framework 数据提供程序说明

    SQL Server .NET Framework 数据提供程序

    提供对 Microsoft SQL Server 7.0 版或更高版本的数据访问。使用 System.Data.SqlClient 命名空间。

    OLE DB .NET Framework 数据提供程序

    适合于使用 OLE DB 公开的数据源。使用 System.Data.OleDb 命名空间。

    ODBC .NET Framework 数据提供程序

    适合于使用 ODBC 公开的数据源。使用 System.Data.Odbc 命名空间。

    Oracle .NET Framework 数据提供程序

    适用于 Oracle 数据源。Oracle .NET Framework 数据提供程序支持 Oracle 客户端软件 8.1.7 版和更高版本,使用 System.Data.OracleClient 命名空间。

    Note注意

    .NET Framework 1.0 版中原来并不包含 ODBC .NET Framework 数据提供程序和 Oracle .NET Framework 数据提供程序。如果需要 ODBC .NET Framework 数据提供程序和 Oracle .NET Framework 数据提供程序,并且使用的是 .NET Framework 1.0,可以从 Data Access and Storage Developer Center 上下载这些数据提供程序。下载的 ODBC .NET Framework 数据提供程序的命名空间为 Microsoft.Data.Odbc。下载的 Oracle .NET Framework 数据提供程序的命名空间为 System.Data.OracleClient。

    .NET Framework 数据提供程序的核心对象

    下表概括了组成 .NET Framework 数据提供程序的四个核心对象。

    对象说明

    Connection

    建立与特定数据源的连接。所有 Connection 对象的基类均为 DbConnection 类。

    Command

    对数据源执行命令。公开 Parameters,并且可以通过 Connection 在 Transaction 的范围内执行。所有 Command 对象的基类均为 DbCommand 类。

    DataReader

    从数据源中读取只进且只读的数据流。所有 DataReader 对象的基类均为 DbDataReader 类。

    DataAdapter

    用数据源填充 DataSet 并解析更新。所有 DataAdapter 对象的基类均为 DbDataAdapter 类。

    除上表列出的核心类之外,.NET Framework 数据提供程序还包含下表列出的类。

    对象说明

    Transaction

    使您能够在数据源的事务中登记命令。所有 Transaction 对象的基类均为 DbTransaction 类。

    CommandBuilder

    帮助器对象将自动生成 DataAdapter 的命令属性或将从存储过程派生参数信息并填充 Command 对象的 Parameters 集合。所有 CommandBuilder 对象的基类均为 DbCommandBuilder 类。

    ConnectionStringBuilder

    帮助器对象为创建和管理 Connection 对象所使用的连接字符串的内容提供了一种简单的方法。所有 ConnectionStringBuilder 对象的基类均为 DbConnectionStringBuilder 类。

    参数

    定义命令和存储过程的输入、输出和返回值参数。所有 Parameter 对象的基类均为 DbParameter 类。

    Exception

    在数据源中遇到错误时返回。对于在客户端遇到的错误,.NET Framework 数据提供程序会引发 .NET Framework 异常。所有 Exception 对象的基类均为 DbException 类。

    Error

    公开数据源返回的警告或错误中的信息。

    ClientPermission

    为 .NET Framework 数据提供程序代码访问安全属性而提供。所有 ClientPermission 对象的基类均为 DBDataPermission 类。

    SQL Server .NET Framework 数据提供程序

    SQL Server .NET Framework 数据提供程序使用它自身的协议与 SQL Server 通信。由于它经过了优化,可以直接访问 SQL Server 而不用添加 OLE DB 或开放式数据库连接 (ODBC) 层,因此它是轻量的,并具有良好的性能。下图将 SQL Server .NET Framework 数据提供程序和 OLE DB .NET Framework 数据提供程序进行了对比。OLE DB .NET Framework 数据提供程序通过 OLE DB 服务组件(提供连接池和事务服务)和数据源的 OLE DB 提供程序与 OLE DB 数据源进行通信。

    Note注意

    ODBC .NET Framework 数据提供程序的结构与 OLE DB .NET Framework 数据提供程序的结构相似;例如,它调入 ODBC 服务组件。

    SQL Server .NET Framework 数据提供程序和 OLE DB .NET Framework 数据提供程序的比较


    数据提供程序

    若要使用 SQL Server .NET Framework 数据提供程序,您必须能够访问 SQL Server 7.0 或更高版本。SQL Server .NET Framework 数据提供程序位于 System.Data.SqlClient 命名空间。对于 SQL Server 的较早版本,请将 OLE DB .NET Framework 数据提供程序与 SQL Server OLE DB 提供程序 (SQLOLEDB) 一起使用。

    SQL Server .NET Framework 数据提供程序支持本地事务和分布式事务两者。对于分布式事务,默认情况下,SQL Server .NET Framework 数据提供程序自动登记在事务中,并从 Windows 组件服务或 System.Transactions 获取事务的详细信息。有关更多信息,请参见执行事务

    以下代码示例显示如何在应用程序中包含 System.Data.SqlClient 命名空间。

    using System.Data.SqlClient;
    

    OLE DB .NET Framework 数据提供程序

    OLE DB .NET Framework 数据提供程序通过 COM Interop 使用本机 OLE DB 启用数据访问。OLE DB .NET Framework 数据提供程序支持本地事务和分布式事务两者。对于分布式事务,默认情况下,OLE DB .NET Framework 数据提供程序自动登记在事务中,并从 Windows 2000 组件服务获取事务详细信息。有关更多信息,请参见执行事务

    下表显示已经用 ADO.NET 进行测试的提供程序。

    驱动程序提供程序

    SQLOLEDB

    用于 SQL Server 的 Microsoft OLE DB 提供程序

    MSDAORA

    用于 Oracle 的 Microsoft OLE DB 提供程序

    Microsoft.Jet.OLEDB.4.0

    用于 Microsoft Jet 的 OLE DB 提供程序

    Note注意

    不推荐将 Access (Jet) 数据库用作多线程应用程序(如 ASP.NET 应用程序)的数据源。如果必须将 Access 数据库用作 ASP.NET 应用程序的数据源,而且不能使用其他数据库(如 SQL Server 或 MSDE),那么请注意,连接到 Access 数据库的 ASP.NET 应用程序可能会遇到连接问题,这些问题通常与安全权限有关。有关使用 ASP.NET 和 Access 数据库时的连接问题的疑难解答,请参见位于 Microsoft Knowledge Base 的文章 Q316675“PRB: Cannot Connect to Access Database from ASP.NET”(英文)。

    OLE DB .NET Framework 数据提供程序不支持 OLE DB 2.5 版接口。要求支持 OLE DB 2.5 接口的 OLE DB 提供程序将无法与 OLE DB .NET Framework 数据提供程序一起正常运行。这种 OLE DB 提供程序包括用于 Exchange 的 Microsoft OLE DB 提供程序和用于 Internet 发布的 Microsoft OLE DB 提供程序。

    OLE DB .NET Framework 数据提供程序无法与用于 ODBC 的 OLE DB 提供程序 (MSDASQL) 一起使用。要使用 ADO.NET 访问 ODBC 数据源,请使用 ODBC .NET Framework 数据提供程序。

    OLE DB .NET Framework 数据提供程序类位于 System.Data.OleDb 命名空间中。以下代码示例显示如何在应用程序中包含 System.Data.OleDb 命名空间。

    using System.Data.OleDb;
    
    Note注意

    OLE DB .NET Framework 数据提供程序要求安装 MDAC 2.6 或更高版本,建议安装 MDAC 2.8 Service Pack 1 (SP1)。可以从 Data Access and Storage Developer Center 上下载 MDAC 2.8 SP1。

    ODBC .NET Framework 数据提供程序

    ODBC .NET Framework 数据提供程序使用本机 ODBC 驱动程序管理器 (DM) 启用数据访问。ODBC 数据提供程序支持本地事务和分布式事务两者。对于分布式事务,默认情况下,ODBC 数据提供程序自动登记在事务中,并从 Windows 2000 组件服务获取事务的详细信息。有关更多信息,请参见执行事务

    下表显示了用 ADO.NET 测试的 ODBC 驱动程序。

    驱动程序

    SQL Server

    Microsoft ODBC for Oracle

    Microsoft Access 驱动程序 (*.mdb)

    ODBC .NET Framework 数据提供程序类位于 System.Data.Odbc 命名空间中。

    以下代码示例显示如何在您的应用程序中包含 System.Data.Odbc 命名空间。

    using System.Data.Odbc;
    

    Oracle .NET Framework 数据提供程序

    Oracle .NET Framework 数据提供程序通过 Oracle 客户端连接软件启用对 Oracle 数据源的数据访问。该数据提供程序支持 Oracle 客户端软件 8.1.7 版或更高版本。该数据提供程序支持本地事务和分布式事务两者。有关更多信息,请参见执行事务

    Oracle .NET Framework 数据提供程序要求必须先在系统上安装 Oracle 客户端软件(8.1.7 版或更高版本),才能连接到 Oracle 数据源。

    Oracle .NET Framework 数据提供程序类位于 System.Data.OracleClient 命名空间中,并包含在 System.Data.OracleClient.dll 程序集中。在编译使用该数据提供程序的应用程序时,需要同时引用 System.Data.dll 和 System.Data.OracleClient.dll。

    以下代码示例显示如何在您的应用程序中包含 System.Data.OracleClient 命名空间。

    using System.Data;
    using System.Data.OracleClient;
    

    选择 .NET Framework 数据提供程序

    根据应用程序的设计和数据源,您所选择的 .NET Framework 数据提供程序可以提高应用程序的性能、功能和完整性。下表讨论各个 .NET Framework 数据提供程序的优点和限制。

    提供程序说明

    SQL Server .NET Framework 数据提供程序

    建议用于使用 Microsoft SQL Server 7.0 或更高版本的中间层应用程序。

    建议用于使用 Microsoft 数据库引擎 (MSDE) 或 SQL Server 7.0 或更高版本的单层应用程序。

    建议将用于 SQL Server 的 OLE DB 提供程序 (SQLOLEDB) 与 OLE DB .NET Framework 数据提供程序一起使用。

    对于 SQL Server 6.5 版和较早版本,必须将用于 SQL Server 的 OLE DB 提供程序与 OLE DB .NET Framework 数据提供程序一起使用。

    OLE DB .NET Framework 数据提供程序

    建议用于使用 SQL Server 6.5 或较早版本的中间层应用程序。

    对于 SQL Server 7.0 或更高版本,建议使用 SQL Server .NET Framework 数据提供程序。

    还建议用于使用 Microsoft Access 数据库的单层应用程序。不建议将 Access 数据库用于中间层应用程序。

    ODBC .NET Framework 数据提供程序

    建议用于使用 ODBC 数据源的中间层和单层应用程序。

    Oracle .NET Framework 数据提供程序

    建议用于使用 Oracle 数据源的中间层和单层应用程序。

    ADO.NET DataSet

    DataSet 对象是支持 ADO.NET 的断开式、分布式数据方案的核心对象。DataSet 是数据的内存驻留表示形式,无论数据源是什么,它都会提供一致的关系编程模型。它可以用于多种不同的数据源,用于 XML 数据,或用于管理应用程序本地的数据。DataSet 表示包括相关表、约束和表间关系在内的整个数据集。下图将显示 DataSet 对象模型。

    DataSet 对象模型


    图片:ADO.Net

    DataSet 中的方法和对象与关系数据库模型中的方法和对象一致。

    DataSet 也可以按 XML 的形式来保持和重新加载其内容,并按 XML 架构定义语言 (XSD) 架构的形式来保持和重新加载其架构。有关更多信息,请参见在 DataSet 中使用 XML

    DataTableCollection

    一个 ADO.NET DataSet 包含 DataTable 对象所表示的零个或更多个表的集合。DataTableCollection 包含 DataSet 中的所有 DataTable 对象。

    DataTable 在 System.Data 命名空间中定义,表示内存驻留数据的单个表。其中包含由 DataColumnCollection 表示的列集合以及由 ConstraintCollection 表示的约束集合,这两个集合共同定义表的架构。DataTable 还包含 DataRowCollection 所表示的行的集合,而 DataRowCollection 则包含表中的数据。除了其当前状态之前,DataRow 还会保留其当前版本和初始版本,以标识对行中存储的值的更改。

    DataRelationCollection

    DataSet 在其 DataRelationCollection 对象中包含关系。关系由 DataRelation 对象来表示,它使一个 DataTable 中的行与另一个 DataTable 中的行相关联。关系类似于可能存在于关系数据库中的主键列和外键列之间的联接路径。DataRelation 标识 DataSet 中两个表的匹配列。

    关系使您能够在 DataSet 中从一个表导航至另一个表。DataRelation 的基本元素为关系的名称、相关表的名称以及每个表中的相关列。关系可以通过一个表的多个列来生成,方法是将一组 DataColumn 对象指定为键列。将关系添加到 DataRelationCollection 中之后,可以选择添加 UniqueKeyConstraint 和 ForeignKeyConstraint,在对相关列的值进行更改时,强制执行完整性约束。

    ExtendedProperties

    DataSet、DataTable 和 DataColumn 全部具有 ExtendedProperties 属性。ExtendedProperties 是一个 PropertyCollection,可以在其中加入自定义信息,例如用于生成结果集的 SELECT 语句或生成数据的时间。ExtendedProperties 集合与 DataSet 的架构信息一起持久化。


    并行执行和 ADO.NET

    通过 .NET Framework 中的并行执行,可以在安装了多个 .NET Framework 版本的同一台计算机上使用编译应用程序所针对的版本独占执行应用程序。有关配置并行执行的详细信息,请参见并行 (Side-by-Side) 执行

    使用 .NET Framework 的某个版本编译的应用程序也可以在 .NET Framework 的其他版本上运行。但是,建议您为安装的每个 .NET Framework 版本都编译一个相应版本的应用程序,并单独运行这些应用程序。在任一方案中,您都应该注意各版本之间 ADO.NET 中的更改,这些更改可能影响到应用程序向前或向后的兼容性。

    向前兼容性和向后兼容性

    向前兼容性意味着某个应用程序可以使用较早版本的 .NET Framework 进行编译,但是仍可以在较高版本的 .NET Framework 上成功运行。为 .NET Framework 1.1 版编写的 ADO.NET 代码与 .NET Framework 2.0 向前兼容。

    向后兼容性意味着某个应用程序为较高版本的 .NET Framework 进行编译,但是可以继续在较早版本的 .NET Framework 上运行,功能没有任何损失。当然,对于新版本的 .NET Framework 中引入的功能,不属于这种情况。有关 .NET Framework 2.0 版中为 ADO.NET 新增的功能的信息,请参见 ADO.NET 中的新增功能

    尽管 .NET Framework 中的 ADO.NET 组件旨在同时提供向前和向后兼容性(除了新功能),但仍然需要注意几个会影响应用程序向前和向后兼容性的问题。

    以下各节描述可能影响 ADO.NET 代码的向前或向后兼容性的并行执行问题,包括:

    • ODBC .NET Framework 数据提供程序

    • Oracle .NET Framework 数据提供程序

    • 代码访问安全性

    • DataSet

    • SqlCommand 执行

    • Microsoft 数据访问组件 (MDAC)

    ODBC .NET Framework 数据提供程序

    ODBC .NET Framework 数据提供程序 (System.Data.Odbc) 从 1.1 版开始就作为 .NET Framework 的一部分提供。.NET Framework 1.0 版开发人员可以从 Data Access and Storage Developer Center 通过 Web 下载获得 ODBC 数据提供程序。下载的 ODBC .NET Framework 数据提供程序的命名空间为 Microsoft.Data.Odbc。

    如果您有一个为 .NET Framework 1.0 版开发的应用程序,它使用 ODBC 数据提供程序连接到您的数据源。如果要在 .NET Framework 1.1 版或更高版本上运行该应用程序,必须将 ODBC 数据提供程序的命名空间更新为 System.Data.Odbc。然后,必须为更高版本的 .NET Framework 重新编译该应用程序。

    如果您有一个为 .NET Framework 2.0 版开发的应用程序,它使用 ODBC 数据提供程序连接到您的数据源。如果要在 .NET Framework 1.0 版上运行该应用程序,必须下载 ODBC 数据提供程序并将其安装到 .NET Framework 1.0 版系统上。然后必须将 ODBC 数据提供程序的命名空间更改为 Microsoft.Data.Odbc,并为 .NET Framework 1.0 版重新编译该应用程序。

    Oracle .NET Framework 数据提供程序

    Oracle .NET Framework 数据提供程序 (System.Data.OracleClient) 从 1.1 版开始就作为 .NET Framework 的一部分提供。.NET Framework 1.0 版开发人员可以从 Data Access and Storage Developer Center 通过 Web 下载获得数据提供程序。

    如果您有一个为 .NET Framework 2.0 版开发的应用程序,它使用数据提供程序连接到您的数据源。如果要在 .NET Framework 1.0 版上运行该应用程序,必须下载数据提供程序并将其安装到 .NET Framework 1.0 版系统上。

    代码访问安全性

    .NET Framework 1.0 版中的 .NET Framework 数据提供程序(System.Data.SqlClientSystem.Data.OleDb)必须在 FullTrust 权限下运行。在权限级别低于 FullTrust 的区域中,从 .NET Framework 1.0 版使用 .NET Framework 数据提供程序的任何尝试都会导致 SecurityException

    但是,随着 .NET Framework 2.0 版的发布,所有 .NET Framework 数据提供程序均可以在部分信任的区域中使用。此外,为 .NET Framework 1.1 版中的 .NET Framework 数据提供程序增加了一项新的安全功能。通过该功能可以限制特定安全区域中可以使用的连接字符串。您也可以对特定安全区域禁用空白密码。有关更多信息,请参见代码访问安全性和 ADO.NET

    因为每个 .NET Framework 安装均有独立的 Security.config 文件,所以,安全设置不存在兼容性问题。但是,如果应用程序依赖于 .NET Framework 1.1 版以及更高版本中包含的额外 ADO.NET 安全功能,则无法将它分发到 1.0 版系统中。

    SqlCommand 执行

    从 .NET Framework 1.1 版开始,ExecuteReader 在数据源处执行命令的方式已更改。

    在 .NET Framework 1.0 版中,ExecuteReader 在 sp_executesql 存储过程的上下文中执行所有命令。因此,影响连接状态的命令(例如,SET NOCOUNT ON)只应用于当前命令的执行。对于在连接打开时执行的任何后续命令,连接状态不会被修改。

    在 .NET Framework 1.1 版以及更高版本中,如果命令含有参数,则 ExecuteReader 只在 sp_executesql 存储过程的上下文中执行该命令,因为这样可以提高性能。因此,如果非参数化命令中包含影响连接状态的命令,会修改在连接打开时执行的所有后续命令的连接状态。

    请考虑下面这个在 ExecuteReader 调用中执行的批命令。

    SET NOCOUNT ON;
    SELECT * FROM dbo.Customers;
    

    在 .NET Framework 1.1 版以及更高版本中,NOCOUNT 对连接打开时执行的任何后续命令都将保持为 ON。而在 .NET Framework 1.0 版中,NOCOUNT 只在当前命令执行时为 ON。

    如果您的应用程序依赖于任一 .NET Framework 版本的 ExecuteReader 的行为,则此更改对应用程序的向前和向后兼容性都有影响。

    对于在 .NET Framework 的早期版本和更高版本上运行的应用程序,可以编写代码确保它的行为总是相同的,与运行它的版本无关。如果要确保某个命令修改所有后续命令的连接状态,我们建议您使用 ExecuteNonQuery 执行命令。如果要确保某个命令不修改所有后续命令的连接,我们建议您加入重置命令中的连接状态的命令。例如:

    SET NOCOUNT ON;
    SELECT * FROM dbo.Customers;
    SET NOCOUNT OFF;
    

    Microsoft 数据访问组件 (MDAC)

    OLE DB .NET Framework 数据提供程序和 ODBC .NET Framework 数据提供程序要求在所有版本的 .NET Framework 上安装 MDAC 2.6 或更高版本,我们建议安装 MDAC 2.8 SP1。虽然这个要求并不会引入并行执行问题,但务必注意 MDAC 目前并不支持并行执行。因此,在为您的安装升级 MDAC 组件前,务必要验证在新版本下,您的应用程序是否还能正常运行。


    ADO.NET 示例应用程序

    下面是一个简单的 ADO.NET 应用程序,它从数据源中返回结果并输出到控制台或命令提示符窗口。

    本主题中的示例显示如何使用 SQL Server .NET Framework 数据提供程序 (System.Data.SqlClient)、OLE DB .NET Framework 数据提供程序 (System.Data.OleDb)、ODBC .NET Framework 数据提供程序 (System.Data.Odbc) 和 Oracle .NET Framework 数据提供程序 (System.Data.OracleClient) 连接并检索数据。如果需要,所有数据提供程序都可以在单个的应用程序中使用。

    下面的 SqlClient 示例假定您可以连接到 Microsoft SQL Server 7.0 或更高版本上的 Northwind 示例数据库,并使用 SqlDataReader 从 Categories 表返回记录列表。OleDb 和 Odbc 示例假定已与 Microsoft Access Northwind 示例数据库建立连接。OracleClient 示例假定已与 Oracle 服务器上的 DEMO.CUSTOMER 建立连接。还必须添加对 System.Data.OracleClient.dll 的引用。

    SqlClient

    using System;
    using System.Data;
    using System.Data.SqlClient;
    
    class Program
    {
        static void Main()
        {
            string connectionString = GetConnectionString();
            string queryString = 
                "SELECT CategoryID, CategoryName FROM dbo.Categories;";
            using (SqlConnection connection = 
                       new SqlConnection(connectionString))
            {
                SqlCommand command = connection.CreateCommand();
                command.CommandText = queryString;
    
                try
                {
                    connection.Open();
    
                    SqlDataReader reader = command.ExecuteReader();
    
                    while (reader.Read())
                    {
                        Console.WriteLine("\t{0}\t{1}",
                            reader[0], reader[1]);
                    }
                    reader.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    
        static private string GetConnectionString()
        {
            // To avoid storing the connection string in your code, 
            // you can retrieve it from a configuration file.
            return "Data Source=(local);Initial Catalog=Northwind;"
                + "Integrated Security=SSPI";
        }
    }
    
    

    OleDb

    using System;
    using System.Data;
    using System.Data.OleDb;
    
    class Program
    {
        static void Main()
        {
            string connectionString = GetConnectionString();
            string queryString =
                "SELECT CategoryID, CategoryName FROM Categories;";
            using (OleDbConnection connection =
                       new OleDbConnection(connectionString))
            {
                OleDbCommand command = connection.CreateCommand();
                command.CommandText = queryString;
    
                try
                {
                    connection.Open();
    
                    OleDbDataReader reader = command.ExecuteReader();
    
                    while (reader.Read())
                    {
                        Console.WriteLine("\t{0}\t{1}",
                            reader[0], reader[1]);
                    }
                    reader.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    
        static private string GetConnectionString()
        {
            // To avoid storing the connection string in your code, 
            // you can retrieve it from a configuration file.
            // Assumes Northwind.mdb is located in the c:\Data folder.
            return "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
                + "c:\\Data\\Northwind.mdb;User Id=admin;Password=;";
        }
    }
    
    

    Odbc

    using System;
    using System.Data;
    using System.Data.Odbc;
    
    class Program
    {
        static void Main()
        {
            string connectionString = GetConnectionString();
            string queryString =
                "SELECT CategoryID, CategoryName FROM Categories;";
            using (OdbcConnection connection =
                       new OdbcConnection(connectionString))
            {
                OdbcCommand command = connection.CreateCommand();
                command.CommandText = queryString;
    
                try
                {
                    connection.Open();
    
                    OdbcDataReader reader = command.ExecuteReader();
    
                    while (reader.Read())
                    {
                        Console.WriteLine("\t{0}\t{1}",
                            reader[0], reader[1]);
                    }
                    reader.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    
        static private string GetConnectionString()
        {
            // To avoid storing the connection string in your code, 
            // you can retrieve it from a configuration file.
            // Assumes Northwind.mdb is located in the c:\Data folder.
            return "Driver={Microsoft Access Driver (*.mdb)};"
                + "Dbq=c:\\Data\\Northwind.mdb;Uid=Admin;Pwd=;";
        }
    }
    
    

    OracleClient

    using System;
    using System.Data;
    using System.Data.OracleClient;
    
    class Program
    {
        static void Main()
        {
            string connectionString = GetConnectionString();
            string queryString =
                "SELECT CUSTOMER_ID, NAME FROM DEMO.CUSTOMER";
            using (OracleConnection connection =
                       new OracleConnection(connectionString))
            {
                OracleCommand command = connection.CreateCommand();
                command.CommandText = queryString;
    
                try
                {
                    connection.Open();
    
                    OracleDataReader reader = command.ExecuteReader();
    
                    while (reader.Read())
                    {
                        Console.WriteLine("\t{0}\t{1}",
                            reader[0], reader[1]);
                    }
                    reader.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    
        static private string GetConnectionString()
        {
            // To avoid storing the connection string in your code, 
            // you can retrieve it from a configuration file.
            // Assumes Northwind.mdb is located in the c:\Data folder.
            return "Data Source=ThisOracleServer;Integrated Security=yes;";
        }
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值