类型:转载 责任编辑:asp.net 日期:2007/05/23
热门软件下载:










页面导航:
正文内容:
ado.net 2.0随附了大量的新功能,这包括一个新的基于基类的提供程序模型、所有提供程序都可以利用的功能以及特定于system.data.sqlclient的更改。因为.net framework 2.0是与sql server 2005一起发布的,所以其中的一些功能要求在sql server 2005种也可用。本文旨在充当新功能的概述和路线图,提供它们的用法示例,并且包含了一个说明哪些功能不特定于提供程序和哪些功能特定于sqlclient的图表。
基于基类的提供程序模型
在ado.net 1.0和1.1中,提供程序编写器实现了一系列特定于提供程序的类。基于每个类都实现了一个通用接口的事实,所以,可以利用通用编码。例如,system.data.sqlclient包含类sqlconnection,并且该类实现了idbconnection。system.data.oracleclient包含类oracleconnection,后者也实现了idbconnection。特定于提供程序的类可以实现特定于数据源的属性和方法,例如,sqlconnection可以实现database属性和changedatabase方法。但oracleconnection不是这样,因为oracle数据库不具有每个数据库实例拥有多个“数据库”(它们在ansi sql中称为编录)的概念。ado.net 2.0中的新提供程序模型基于system.data.common中的一系列基类。这些基类提供了常见功能的基本实现,当然,其中的每个基类还实现了仍然需要的通用接口,以便向后兼容。提供程序编写器可以选择使用基类或者支持接口。以前版本中的接口模型有两个特例:dataadapter/dbdataadapter和commandbuilder。commandbuilder类为一个简单的select命令提供了对使用相同列集的insert、update和delete命令的自动实现。在保持commandbuilder用于创建操作语句的基本算法的同时对其进行扩展是不可能的,因为sqlcommandbuilder是一个密封类。尽管仍然无法重用sqlcommandbuilder参数分析程序,但是system.data.common中有一个dbcommandbuilder基类。在这些类的基类级别也公开了新功能,dataadapter/dbdataadapter基类公开了用于将特定于提供程序的类型(如sql server sqltypes)推到数据集(returnproviderspecifictypes属性)中以及进行批更新(statementtype.batch枚举值和updatebatchsize属性)的机制。dbcommandbuilder公共基类包含了一个用于指示并发策略选择的属性(conflictdetection属性)。
提供程序工厂
ado.net 1.0和1.1中基于接口的方法的复杂性之一在于:您无法在接口上调用构造函数,您必须创建特定类的具体实例。以前的api(如ole db和ado)通过重载连接字符串来解决这一问题。连接字符串包含提供程序的com progid,而正确的datasource类是基于该progid创建的。因为ole db datasource progid存储在注册表中,所以这是可能的。
vb6 ado code, connection is an interface (actually its _connection)
dim conn as connection
note that the default provider is msdasql, the ole db provider for odbc
this uses the ole db provider for sql server
conn.connectionstring = "provider=sqloledb;.." other parameters deleted
conn.open
ado.net 2.0具有与此对应的解决方案。每个数据提供程序都在.net machine.config中注册了一个providerfactory类和一个提供程序字符串。有一个providerfactory基类(dbproviderfactory)和一个system.data.common.providerfactories类,可以返回有关machine.config中注册的不同数据提供程序信息的datatable,而且还可以在给定该datatable中的提供程序字符串(称为providerinvariantname)或datarow的情况下检索正确的providerfactory。以前通常按如下方式编写条件代码:
enum provider {sqlserver, oracle, oledb, odbc};
// determine provider from configuration
provider prov = getproviderfromconfigfile();
idbconnection conn = null;
switch (prov) {
case provider.sqlserver:
conn = new sqlconnection();
break;
case provider.oracle:
conn = new oracleconnection();
break;
case provider.oledb:
conn = new oledbconnection();
break;
case provider.odbc:
conn = new odbcconnection();
break;
// add new providers as the application supports them
}
现在可以按如下方式编写:
// get providerinvariantstring from configuration
string provstring = getproviderinvariantstring();
dbproviderfactory fact = dbproviderfactories.getfactory(provstring);
idbconnection = fact.createconnection();
由于出现了用于检索安装在计算机上的数据提供程序以及为每个数据提供程序检索providerfactory的标准,因此带来了其他一些有趣的可能性。
服务器枚举
machine.config中的提供程序配置项目指定了一个位掩码,以指示该提供程序支持哪些基类或基接口。这是因为并非所有的数据提供程序都需要支持system.data.common中的所有功能。例如,commandbuilder是一个“最好具有”的类,但是没有它您也可以很好地完成工作。dbenumerator是一个新的基类,它已经被添加到ado.net 2.0的混合功能中。该类使支持它的数据提供程序可以获得数据源列表。例如,sqlclient支持该类并且返回网络中可用的sql server实例的列表。这使得程序和工具可以为用户提供精选的数据源。使用这一功能的工具之一是visual studio 2005。
连接字符串生成器和元数据架构
直到现在,visual studio .net仍然使用ole db组件生成连接字符串以表示数据源。当您使用visual studio 2005中的服务器资源管理器在visual studio .net 2003中添加新的数据连接时,它会显示ole db连接字符串生成器,该生成器会列出计算机上安装的ole db提供程序而不是.net数据提供程序。然后,它允许您选择一个提供程序(虽然是ole db提供程序),并为相应的提供程序生成一个ado.net连接字符串。在visual studio 2005中,上面提到的dbproviderfactories可以为您显示一列.net数据提供程序,并且图形用户界面组件使用类dbconnectionstringbuilder使程序员能够以图形方式生成连接字符串,以及从配置文件中加载连接字符串和在配置文件中存储连接字符串。visual studio 2005服务器资源管理器还可以获取数据源元数据(例如表、列、视图和存储过程的列表)以进行显示。ansi sql规范具有对应于该元数据的基本规范,该规范称为information_schema视图。这些通用视图是一个很好的起点,但有时需要用特定于数据库的视图或信息进行扩展。在ado.net 2.0中,数据提供程序可以提供一个xml格式的配置文件,以列出哪些元数据可用以及如何从数据库中获得它们,这是因为并非所有的数据库都支持information_schema视图。这将在允许工具程序员( tool programmer)获得提供程序定义的扩展信息集方面提供巨大的帮助。
跟踪
允许程序员和技术支持人员在获得来自用户的说明或来自程序的错误信息之后,对数据库api的调用进行跟踪以查明问题位于数据访问堆栈中的哪个位置,将会非常有用。通常,问题可能产生于下列方面:
1. 客户端程序和数据库实体之间架构不匹配。
2. 数据库的不可用性或网络库问题。
3. 不正确的sql(无论是硬编码的还是由应用程序生成的)。
4. 不正确的编程逻辑。
在过去,编写代码以允许跟踪的工作是留给各个提供程序编写者完成的,尽管在某些api(例如odbc)中存在一些事实上的标准。由于缺少标准的ole db跟踪,因此解决ole db和ado问题变得更为困难。尽管这不是ado.net所独有的体系结构,但ado.net 2.0中的microsoft提供程序利用了一般化的跟踪和检测api。使用这一新功能,您将能够在应用程序堆栈的任何级别跟踪问题。不仅microsoft ado.net提供程序被检测,而且数据访问堆栈的其他部分也使用了该功能,并且提供程序编写者也可以实现该功能。甚至ado.net 2.0数据集和相关的类也具有内置的诊断机制。我将在以后的文章中深入讨论跟踪。
sqlclient增强
microsoft的主打数据库是sql server,而sqlclient是特定于sql server的提供程序。ado.net 2.0实际上随附了四个microsoft提供程序:
1. sqlclient—用于sql server的microsoft提供程序。
2. oracleclient—用于oracle数据库的microsoft提供程序。
3. oledb—用于在ado.net中使用ole db提供程序的桥梁提供程序。
4. odbc—用于在ado.net中使用odbc驱动程序的桥梁提供程序。
在ado.net 2.0中,已经对上述所有四个提供程序进行了增强,以便能够在部分受信任的环境中使用它们。通过正确地配置.net代码访问安全性(cas),可以启用更多以数据为中心的移动代码方案。在ado.net 1.1中,只有sqlclient提供程序支持该功能。此外,数据提供程序由数据库公司(oracle的odp.net和ibm的用于db2的数据提供程序)、提供程序专业公司(datadirect technologies)、开放源代码项目和个人编写。此外,microsoft将在host integration server 2004产品中随附db2数据提供程序。因为sql server是软件难题的一个重要部分,所以除了对所有microsoft支持的提供程序的增强以外,还有许多对ado.net 2.0中的sqlclient进行的增强。该功能的某些部分支持任何版本的sql server,而该新功能的大部分旨在支持sql server 2005(它的代号“yukon”可能更容易为大家所知)中提供的许多新功能。sql server 2005支持在该服务器内部运行的.net代码,而且在使用提供程序模型的服务器内部还有对数据访问的优化。一项较大的内部更改(并不显而易见)是,ado.net 2.0中的sqlclient数据提供程序不使用microsoft数据访问组件(mdac)。在该提供程序中还有更好的错误处理,网络错误的错误信息更加清楚,并且错误信息在总体上更加具体。以下是供程序员参阅的特定于sqlclient的功能概述。
连接池增强
ado.net 1.0引入了一种用于汇集数据库连接的新基础结构。microsoft sqlclient和oracleclient数据提供程序使用该基础结构,而oledb和odbc数据提供程序不使用该基础结构。新的池机制提供对连接池参数的粒度支持,包括最小和最大池大小以及池管理者等待将连接在池中变为可用的连接所需的用户自定义时间量的能力。ado.net添加了连接池增强功能,以使您能够以编程方式“排干”连接池;即关闭当前由汇集者保持活动的所有连接。您可以使用静态(在visual basic .net中共享)方法sqlconnection.clearpool清除特定的连接池,或者使用sqlconnection.clearpools方法清除应用程序域中的所有连接池。sqlclient和oracleclient都实现了该功能。