ADO.NET为底层数据库提供了不同的连接对象的特定实现。换言之,为了连接到微软SQL Server数据库,要通过特定的名为SqlConnection的类。实际上,所有SQL Server特有的类都位于System.Data.SqlClient命名空间下。类似地,所有Oracle相关的类都位于System.Data.Oracle- Client命名空间下。

这些针对特定数据库的特定实现被称为.NET数据提供程序。如图1-4所示。

.NET数据提供程序

连接对象

非连接对象

应用程序

数据源

图1-4  .NET数据提供程序及其在更大范围的图示中的位置

现代计算领域为我们提供了很多流行的数据库来选择。正如本章开始介绍的那样,这些数据库可以是基于服务器的或基于文件的。基于服务器的数据库更为稳定,也能更好地支持多个并发用户;而基于文件的数据库在大规模的客户端安装了应用程序的情况下更容易部署和管理。但是,一定要注意这是一般情况;例如,用微软的SQL Server 2005,你可以在拥有成熟的基于服务器的数据库的同时,又能与易用的基于文件的系统进行通信。

在有多种可供选择的数据源的情况下,ADO.NET需要支持各种不同的数据源。每种数据源都可能具有其各自的特性或功能。因此,ADO.NET支持一个提供程序模型。针对一个特定数据源的ADO.NET提供程序可以定义为一个命名空间下的一组类,这些类专门针对这种特定的数据源。

换言之,针对特定的数据源,你需要有特定的.NET数据提供程序。这种差别在OleDb和ODBC之间有些含糊不清,这是因为它们本来就被设计为可与任何OleDb或ODBC兼容的数据库工作,但它们的具体实现是在专门为它们设计的特定的.NET数据提供程序中的。这可以从图1-5中看出。注意你的程序可以使用图1-5中灰色框内部的任何对象。你可以用非连接对象、数据适配器(data adapter)、连接对象或它们的联合体来构建你的应用程序。

非连接对象

SQL Server的
.NET数据
提供程序

OleDb的.NET数据提供程序

一些OleDb兼容数据库

Microsoft SQL
服务器

Oracle的.NET数据提供程序

应用程序

图1-5  完整的模型:应用程序、ADO.NET、多个数据源以及多个数据提供程序

现在稍微考虑一下,比较图1-5和图1-1中的不同之处。图1-5的阴影块表示了图1-1中间块的放大图。

通常,.NET框架自带的提供程序可以在System.Data命名空间下找到其自己的命名空间。表1-1是.NET 2.0框架自带的一些通用的数据提供程序的列表。

表1-1  多个.NET数据提供程序

数据源名称

提供程序命名空间

微软SQL Server 7.0及以上版本

System.Data.SqlClient

Oracle8.1.6及以上版本

System.Data.OracleClient

SQL Server中的SqlXml支持

System.Data.SqlXml

任何ODBC数据源

System.Data.ODBC

任何OleDb数据源

System.Data.OleDb

正如你从表1-1中得知的,微软SQL Server 7.0和Oracle 8.1.6也可以用ODBC或OleDb数据提供程序访问。使用特定数据源的数据提供程序,诸如SqlClient或OracleClient等,会比使用通用数据提供程序更具一些独特的优势:

l 特定数据提供程序,比如SqlClient或OracleClient,具有比通用数据提供程序更高的性能。

l 特定数据提供程序可以更好地配置数据库特定的功能。

l 特定数据提供程序能处理数据库特定的数据类型。在很多情况下这样处理可以免除装箱/拆箱(boxing/unboxing)操作的开销,而且能减少数据类型精确度的错误,这样的错误通常会在把Int64保存到Int32的列时不经意地发生。

然而,在很多情况下,你可能并不知道需要与ADO.NET交互的确切数据源,而ADO.NET就为你在编写与提供程序无关的代码时提供了多种选择。特别地,ADO.NET 1.1为你提供了两种编写与提供程序无关的代码的方法:

l 使用非特定数据提供程序:你可以坚持使用对所有数据源都是通用(common)的最小化的功能,或者使用ODBC或OleDb数据提供程序。这些数据提供程序会有性能问题、功能受损或其他缺陷,因为它们不是数据库特定的。然而,它们有一个优势:可以编写独立于数据库的代码。根据你真正的需求,你可以忽略性能或功能设置问题,并且坚持用一个通用的.NET数据提供程序。

l 使用接口和基类:ADO.NET为大多数普遍需要用到的对象提供了标准接口和基类。比如,System.Data.SqlClient.SqlConnection对象必定实现了System.Data.IDbConnection,而且从System.Data.Providerbase.DbConnectionBase继承而来。使用由父接口或已实现的接口所表示的数据类型,你就可以避免出现运行时类型转换的错误。这种方法的缺点是你还需要坚持使用通用的最小化的功能,即使现在使用ODBC或OleDb数据提供程序时所遇到的性能上的差异并没有多大。

这两种方法并不是最好的。第一种方法不是很好用,第二种方法需要提供一个子集,而且在大多数情况下,是一个与特定数据源提供程序不同的功能集。为了解决这些问题,ADO.NET 2.0提供了一个提供程序工厂(provider factory),在这个工厂中,只要你知道正确的提供程序名称(该名称可以是字符串变量),就可以实例化可用的提供程序。这也被称为ProviderBase模型。

1.4.1  使用ProviderBase模型

这个方法接合了上面两种方法的优势。任何一台具有Windows操作系统的机器都可能安装了多个数据提供程序。在.NET 2.0框架中,Machine.Config文件中有一个配置部分名为DbProvider- Factories。在这个配置部分中,你能定义各种可以通过ProviderBase模型访问的数据提供程序。代码清单1-1显示了一个典型的Machine.Config文件的DbProviderFactories配置部分。

代码清单1-1  DbProviderFactories配置部分

注意    这些配置信息可以定义在任何配置文件中:Machine.Config、App.Config、Web.Config等。自定义的数据提供程序或第三方的数据提供程序可以通过简单地修改适当的配置文件来添加到这个集合中。

你可以使用代码清单1-2和代码清单1-3中的代码来列举计算机上所支持的所有提供程序。

代码清单1-2  列举所有可用的提供程序(C#代码)

代码清单1-3  列举所有可用的提供程序(Visual Basic.NET代码)

这段代码运行时就会产生如下的输出:

如果你真的想用这些数据提供程序中的一个,那么就可以通过代码清单1-4和代码清单1-5来实现。

代码清单1-4  使用ProviderBase模型(C#代码)

代码清单1-5  使用ProviderBase模型(Visual Basic.NET代码)

在代码清单1-4和代码清单1-5中,要注意的是ProviderBase模型可以让你获取强类型的特定提供程序对象,比如SqlConnection和SqlCommand,而不必事先知道用户需要使用哪个提供程序。用户可以通过用户界面上的下拉框选择“System.Data.SqlClient”,该选项只是简单地作为字符串参数传递给GetFactory方法。

这是可以实现的,因为DbProviderFactory对象总是返回这样一些数据类型对象:这些对象实际上是.NET数据提供程序中的各种公共对象的基类。这些公共的基类对象包含在System.Data.Common命名空间下,可以被其他任何类继承以便创建第三方的.NET数据提供程序。

1.4.2  第三方.NET数据提供程序

ADO.NET包含各种基类和接口,可供各种第三方.NET数据提供程序导出或实现,以便创建这些提供程序各自对一些通用对象的特定实现。这些通用对象有Connection、Command等。一个这样的例子就是DbDataAdapter类,该类实现了IDbDataAdapter接口。因此,在System.Data.SqlClient命名空间下的SqlDataAdapter是从DbDataAdapter导出而来的,因而也就实现了IDbDataAdapter接口。这个命名空间下最重要的类如表1-2所示。

表1-2  System.Data.Common命名空间下主要的类

类    名

描    述

DataAdapter

这个类充当了ADO.NET中连接部分和非连接部分之间的关卡。它拥有一组数据命令(DbCommand对象)和一个数据源连接(DbConnection对象),可用于填充DataSet或DataTable,并且能更新数据源。该数据源可以是任意类型的数据源,不像DbDataAdapter,只能用于关系型数据源

DbCommand

这个类用于执行SQL命令,比如对数据源进行SELECT查询

DbCommandBuilder

这个类用于创建INSERT、UPDATE和DELETE这样的SQL语句,用于为数据适配器提供命令对象。它只能用于单个数据源表,而且只有在指定了SELECT SQL语句时才能用,并且返回的行记录结构中至少需要有一个唯一性的列

DbConnection

这个类是连到数据源的实际连接

DbConnectionOptions

这个类是为提供程序工厂类所用的。提供程序工厂类用它创建一个连接;但是,它也可以用于将连接串拆分成键—值对这样的手动处理。它包含一些属性和方法能将键—值对形式的字符串值转换为整数和布尔类型,并监测是否存在特定的键,比如Data Source

(续)

类    名

描    述

DbConnectionStringBuilder

这是一个基类,用于创建连接串,而且能在带有数据提供程序工厂的连接中用于创建连接串、编辑连接串、从配置文件中读取连接串以及将连接串保存到配置文件中。这将在第4章中讨论

DbDataAdapter

这个类是一个与IDbDataAdapter接口一起使用抽象的辅助类。DbDataAdapter类是从DataAdatper类继承而来的,而且能用于为关系型数据库创建数据适配器。这是通过创建一个继承DbDataAdapter类以及实现IDbDataAdapter接口的类来实现的

DbDataReader

这个类从数据源中读取只向前滚的行记录流,并且一次只能访问一行记录。从DbDataReader中读取数据时,必须保证连接是打开的,因为在需要时行记录是直接从数据源中读取出来的

DbDataRecord

这个类实现了IDataRecord和ICustomTypeDescriptor接口,这样它可以为DbEnumerator类提供数据绑定的支持。它经常用在ASP.NET页面中取代DataBinder.Eval方法来实现数据绑定,其中使用了反射,因此会有性能的开销

DbException

这是一个非特定数据异常类,用于抛出数据相关的异常。这个抽象类是从ExternalException类继承而来的

DbParameter

这个类用于为SQL命令提供参数,用于创建动态查询,即通过提供不同的参数值就能改变的查询

DbProviderConfigurationHandler

这个类使用应用程序配置文件的值,来配置DbProviderFactory

DbProviderFactory

基于各种不同的输入,这个类可用于创建特定提供程序的数据依赖的类

DbTransaction

这是一个非特定的事务类,用于把SQL语句封装成要么都执行,要么都不执行的事务。它与连接对象关联使用

转载于:https://www.cnblogs.com/PeterYao/archive/2009/07/19/1526551.html

.NET数据提供程序相关推荐

  1. ADO.NET—数据提供程序(连接类)

    .NET Framework 数据提供程序是专门为数据处理以及快速地只进.只读访问数据而设计的组件. 一.Connection 1.介绍 开启程序和数据库之间的连结 ADO.NET底层 可自己产生对象 ...

  2. .NET实现之(WebService数据提供程序)

    说起数据提供程序大家都不陌生,数据提供程序的作用就是以统一的接口去访问不同的数据源,如OledbProvider.SqlServerProvider.OrcaleProvider等等:不同数据源的访问 ...

  3. 【转】“数据提供程序或其他服务返回 E_FAIL 状态” 或者 Data provider or other service returned an E_FAIL status.

    "数据提供程序或其他服务返回 E_FAIL 状态"  或者  Data provider or other service returned an E_FAIL status. 使 ...

  4. WIN7系统 64位出现 Net Framework 数据提供程序要求 Microsoft Data Access Components(MDAC)....

    WIN7系统 64位出现  Net Framework 数据提供程序要求 Microsoft Data Access Components(MDAC).请安装 Microsoft Data Acces ...

  5. .Net Framework OleDb 数据提供程序要求 Microsoft Data Access Components(MDAC) 2.6 或更高版本。发现当前安装的版本是 2.50.4403.

    问题:  .Net Framework OleDb 数据提供程序要求 Microsoft Data Access Components(MDAC) 2.6 或更高版本.发现当前安装的版本是 2.50. ...

  6. .Net Framework SqlClient 数据提供程序不支持 CommandType 枚举值 512

    文章转载:http://www.cnblogs.com/jhxk/articles/2584298.html 一直都没用过CommandType枚举的TableDirect的方式,今天试了一下报错,原 ...

  7. 错误:数据提供程序或其他服务返回E_FAIL状态 到底怎么回事呢?

    今天碰到这么一个问题,真是郁闷.幸亏有这个浩瀚的网络. 在csdn中看到这么一篇,给我很大的启示. http://community.csdn.net/Expert/topic/4320/432057 ...

  8. 找不到请求的 .Net Framework 数据提供程序。可能没有安装

    今天碰到这个错误, 查看配置文件后发现 , 所以我的解决方案就是换掉provider咯,数据库文件自然也得跟着换 当然,你也可以尝试类似这种方式手工注册缺失的provider 转载于:https:// ...

  9. Linq to SQL只支持SQL Server(所选对象使用不支持的数据提供程序)

    转载于:https://www.cnblogs.com/hawkingXu/p/5131341.html

最新文章

  1. rbac 一个用户对应多个账号_电商后台系统:管理后台之账号管理(一)
  2. cocos creator基础-创建WX开放域遇到的问题
  3. Arduino使用HC05蓝牙模块与手机连接(转载)
  4. mysql limit括号_采坑笔记——mysql的order by和limit排序问题
  5. 关于是否在C#中加入不可空引用类型的争论
  6. Qt 模态对话框不模态的问题
  7. python测试系列教程 —— 单元测试unittest
  8. 转错误 x error LNK1104: 无法打开文件“E:\xxxx\Debug\xxxx.exe”
  9. AXURE 9 # 汉化教程
  10. C++[POJ1849]铲雪车问题——树形DP求出树的直径
  11. Gradient Normalization在多任务学习中的优化实践
  12. html+css制作静态小米商城页面(含css手动轮播图)
  13. SAT数学:必背公式之三角函数
  14. Pytorch入门笔记(一)
  15. 云机器被渗透了怎么办以及解决方法!
  16. 【科学有故事】做节目时的Python分析
  17. cmd.exe启动参数详解
  18. Picasso加载圆角图片
  19. GitChat·DevOps | 如何结合 Scrum 和 Kanban
  20. linux 的gz命令详解,linux tar.gz压缩解压命令详解

热门文章

  1. LuaForUnity7:Lua表与元表
  2. Codeforces Round #190 (Div. 1): E. Ciel and Gondolas(决策单调性DP+wqs二分)
  3. Lengauer-Tarjan算法--支配树构造(bzoj 2815: [ZJOI2012]灾难)
  4. CentOS 7安装部署zabbix3.4
  5. 组素数 蓝桥填空题2013省赛
  6. gRPC传输协议使用(python教程)
  7. js系列教程4-函数、函数参数全解
  8. 二端口网络的归一化转移矩阵[a]
  9. 1208: [HNOI2004]宠物收养所
  10. dev 域名与 Chrome