读者在上一章中已经了解到,在最近几年,Borland的数据库无关性访问解决方案已经从“陈旧的” BDE技术(它大约有10岁)转向比较新的dhExpress体系结构。BDE更多地侧重于本地数据而dbExpress只支持关系数据库的事实明确地指出了一个行业趋势。
同时,Microsoft。一直致力于推广它自己的数据库无关性访问解决方案,尽管Microsoft的“无关性”提议常常与本公司的数据库技术,比如 Access或SQL-Server有点密切相关。Microsoft从Open Database Connectivity(开放式数据库连接性,简称ODBC)开始起步,然后转向OLE DB(一个基于COM的解决方案)和 ActiveX Data Objects(ActiveX数据对象,简称 ADO),而现在一直使用 ADO.NET在.NET上重新加工这个体系结构。 本章将具体关注比较陈旧但仍有生存力的 ADO解决方案,而且 DelPhi在Win32和.NET平台上均支持这个解决方案(在 DelPhi2005中,因为 DelPhi 8 for Mirosoft.NET Framework版本中没有这个特性)。通过使用VCL和ADO构件,本章所讨论的所有示例在.NET Delphi 2005 for Win32和 Delphi 2005 for.NET下都同样工作。要想了解具体的 ADO.NET讨论,请参见下一章。
注意 笔者希望答谢和感谢最初为 《Masteri Delphi 6》(Sybex,2001)编写本章的Guy Smith-Ferrier先生。Guy是 《.NET Internatlonallastlon》(Andlson-Wesley,2005)的作者。他是Courseware Online的总课件设计师、一名 Microsoft Certrfed Professional开发人员、作者、培训讲师和演讲者,并且已经在欧洲和北关的许多学术会议上发表演讲。他是C#/.NET课件和大部分BOrland官方课件的创作者,其中包括关于 COM和 ADO的课件。Guy现在和他的妻子、儿子和女儿居住在英国。
本章将通过使用dbGO来讨论ADO。(dbGO是一套Delphi构件,最初称为ADOExpress,但在 Delphi 6中改名为 dbGo,因为 Borland宁愿避免使用 Microsoft 的商标术语 ADO。在 DelPhi中,在没有使用 dbGO的情况下使用 ADO也是可能的。通过引入ADO类型库,程序员可以直接使用ADO接口;这也是Delphi程序员在Delphi 5发布之前使用ADO的方法。然而,这条途径绕过了DelPhi的数据库基础结构,并且不允许程序员利用其 他Delphi技术,比如数据敏感控件或Datasnap。本章将在所有示例中使用dbGo,不仅因为它是非常容易获得的,甚至在Delphi for.NET中也得到了支持,而且因为它是一个非常有生存力的解决方案。不管读者的最终选择是什么,都将发现本章中的信息是有用的。 本章包括以下内容:Microsoft Data Access Components(数据访问构件,简称MDAC)、Delphi的 dbGo、数据链接文件、获得模式信息、使用Jet引擎、事务处理、不连通与持久性记录集合、公文包模型以及部署MDAC。Microsoft数据访间构件(MDAC)由于 Component Object Model(构件对象模型,简称COM)的成功,Microsoft 于 20世纪90年代中期开始使用OLE DB取代ODBC。然而,OLE DB是 Microsoft归类为一个系 统级接口的东西,并且打算供系统级程序员使用。它是非常庞大、复杂而又不可容忍的。它对程序员提出了更高的要求,并且需要更高水平的知识,但换来的却是更低的工作效率。ActiveX Data Objects(ActiveX数据对象,简称 ADO)是OLE DB上面的一层,并称为一个应用级接口。它比OLE DB简单许多,并且是可容忍的。简单地说,它是被设计用来供应用程序员使用的。 正如读者在第14章中看到的,Borland使用dbExPress替换了BDE。ADO与BDE共有的相似之处多于它与轻便型dbExpress技术共有的相似之处;然而,BDE和ADO支持数据集的导航和操纵、事务处理以及高速缓存的更新(在ADO中叫做批更新),因此使用ADO所牵涉到的概念和问题类似于BDE的概念和问题。
注意:本书不涉及BDE技术。但是,读者可以在 Essential Delphi中发现一个对BDE 的介绍(请参见附录 A中关于 Essential Delphi的讨论)。
ADO是Mlcrosoft Data Access Components(Microsoft数据访问构件,MDAC)的一部分。MDAC是Microsoft数据库技术的一个保护伞,并且包括了 ADO、OLE DB、ODBC以及 RDS(Remote Data Services,远程数据服务)。读者将会经常听到人们交替地使用术语MDAC与ADO,但这是不正确的。由于ADO仅被发布为MDAC的一部分,所以我们需要MDAC版本的术语来谈论ADO版本。MDAC的主要版本有1.5、2.0、2.1以及2.5到2.8。Microsoft独立地发布MDAC,并且使它可供免费下载和实际免费分发(有一些分发要求,但大部分Delphi开发人员在满足这些要求方面将不会有任何麻烦)。MDAC还随同大部分带有各种数据库内容的 Microsoft产品一起分发。DelPhi 2005携带 MDAC2.8。
这一级别的可获得性有两种结果。第一,用户很有可能已经请人把MDAC安装在他们的机器上。第二,无论用户拥有什么版本或者程序员把他们升级到什么版本,有人—程序员、用户或其他应用程序软件将把他们的现有MDAC升级到MDAC的当前版本实际上也是确定无疑的。程序员无法阻止这种升级,因为MDAC随同像Internet ExPlorer这样的常用软件一起得到安装。再加上这样一个事实:Microsoft只支持MDAC的当前版本与前一个版 本,因而程序员必然得出这样的结论:必须把应用程序设计成利用MDAC的当前版本或前一个版本。 作为一名 ADO开发人员,读者应该定期地检查 Microsoft网站上的那些MDAC页面(www·microsoft.corn/data)。从那里,读者可以免费下载MDAC的最新版本。当到达这个网站上时,如果读者还没有 MDAC SDK (15M),应该利用这次机会下载它,或者下载Platform SDK(MDAC SDK是 Patform SDK的一部分)。 MDAC SDK是各位的“圣经”:应该下载它,经常参考它,并使用它来解答ADO问题。在需要MDAC信息时,应该将它作为第一个信息源。 OLE DB提供者 OLE DB提供者能够提供访问数据源的途径。它们是等效于 dbExpress驱动程序的ADO驱动程序。在程序员安装 MDAC时,他们自动安装一系列 OLE DB提供者。表15.1 列出了这些OLE DB提供者当中的一部分:
· ODBC OLE DB提供者用来提供与ODBC的向下兼容性。随着读者对 ADO了解的逐 渐深人,将会发现这个提供者的局限性。 · Jet OLE DB提供者支持 MS Access及其他桌面数据库。稍后,我们将会返回来讨论这些提供者。 · SQLServer提供者支持 SQL Server 7、SQLServer 2000和 Microsoft Database Engine(MSDE)。MSDE是SQL Server的精简版本,去除了大部分的工具,而且当超 过5个活动连接时,会添加一些代码故意降低性能。MSDE之所以重要,是因为它 是免费的,并且它与SQL Server是完全兼容的。 除了这些 MDAC OLE DB提供者,Microsoft还随同其他产品或可下载 SDK提供了其他OLE DB 提供者。
例如: Active Directory Services OLE DB提供者与 ADSI SDK包含在一起;AS/400和VSAM OLE DB提供者与SNA Server包含在一起;
Exchange OLE DB提供者与MirosoftExchange2000包含在一起;用于Intern。tPublishing的(JI-EDB提供者允许开发人员使用HTTP来处理目录与文件。 还有更多的 OLE DB提供者以“服务提供者”的形式出现。正如它们的名称所暗示的,OLE DB服务提供者给其他 OLE DB提供者提供一种服务。通常,这些服务提供者在必要时自动得到调用,无需程序员进行干预。例如,Cursor Service在程序员创建一个客户端游标时得到调用,而 Persisted Recordset提供者被调用以局部地保存数据。 MDAC包含了我们将要讨论到的许多提供者,但是还有更多的提供者可以从 Microsoft或第三方市场上获得。可靠地列出所有可以获得的 OLE DB提供者是不太可能的,因为这个列表将会非常巨大,而且会经常变化。除了独立的第三方之外,还应当考虑大多数的数据库供应商,因为这些数据库供应商的大多数现在提供它们自己的 OLE DB提供者。例如,Oracle提供ORAOLEDB提供者;
表15.1 MDAC中包含的部分OLE DB的提供者
驱动程序 |
提供者 |
描述 |
MSDASQL |
ODBC Drivers |
ODBC 驱动 |
Microsoft.Jet.OLEDB.4.0 |
Jet 4.0 |
MS Access 与其他数据库 |
SQLOLEDB |
SQL Server |
SQL Server 驱动 |
MSDAORA |
Oracle |
Oracle 驱动 |
SampProv |
Sample |
CSV 文件驱动 |
提供者CSV义件的()IE DB提供者的一个示例提示在提供OLE DB提供者的供应商当中,一个值得注意的遗漏是 InterBase。除了使用ODBC驱动程序访问它之外,还可以使用DTnitry Kovalenko的IBProvder (www.lop。 llpetsk.ru/prog/eng/index.html)。另外,请检查 Binh-y的 OLEDB提供者开发工具箱(www.techvanguards.corn/products/optk)。如果读者需要编写自己的(OLE DB提供者,这个工具使用起来比其他大多数工具容易。使用dbGO构件 熟悉dbExpress或IBExpress的程序员应该认识构成dbGo的这组构件。表15.2比较了ADO构件与dbExpress等效构件 |